c - 我在分配内存和使用它时找不到逻辑错误
问题描述
我正在学习 C 中的内存。我正在尝试将质数保存在指针 prime_numers 中。但它没有用。很抱歉,因为我的英语水平太短,我无法解释更多。请帮助这个苦苦挣扎的学生。
#include <stdio.h>
#include <stdlib.h>
int Modulation(unsigned int);
int main()
{
int *prime_numbers;
int a = 1;
prime_numbers = &a;
int count = 2;
int p_count = 1;
int num = 10;
while(count<=num)
{
if(Modulation(count) == 1)
{
prime_numbers = malloc(sizeof(int));
printf("this is count %d\n", count);
printf("this is prime_numbers + p_count %d\n", prime_numbers+p_count);
printf("this is p_count %d\n\n", p_count);
*(prime_numbers+p_count) = count;
p_count += 1;
}
count += 1;
}
for(int i=0 ; i<p_count ; i++)
{
printf("%d ", *(prime_numbers+i));
}
printf("\n\nThis is p_count %d", p_count);
free(prime_numbers);
return 0;
}
int Modulation(unsigned int num)
{
unsigned int count = 2;
while(count < num)
{
if(num%count == 0)
{
return 0;
}
count += 1;
}
return 1;
}
解决方案
您只分配一个元素。您可以使用realloc
发光先前分配的数组。
也使用%d
打印指针将调用未定义的行为。要通过 打印指针printf()
,您应该将指针转换为void*
并使用%p
.
修复代码(省略错误检查):
#include <stdio.h>
#include <stdlib.h>
int Modulation(unsigned int);
int main()
{
int *prime_numbers = malloc(sizeof(int));
int a = 1;
prime_numbers[0] = a;
int count = 2;
int p_count = 1;
int num = 10;
while(count<=num)
{
if(Modulation(count) == 1)
{
prime_numbers = realloc(prime_numbers, sizeof(int) * (p_count + 1));
printf("this is count %d\n", count);
printf("this is prime_numbers + p_count %p\n", (void*)(prime_numbers+p_count));
printf("this is p_count %d\n\n", p_count);
*(prime_numbers+p_count) = count;
p_count += 1;
}
count += 1;
}
for(int i=0 ; i<p_count ; i++)
{
printf("%d ", *(prime_numbers+i));
}
printf("\n\nThis is p_count %d", p_count);
free(prime_numbers);
return 0;
}
int Modulation(unsigned int num)
{
unsigned int count = 2;
while(count < num)
{
if(num%count == 0)
{
return 0;
}
count += 1;
}
return 1;
}
我只修复了未定义的行为,但您的代码还有另一个逻辑错误:1
is in the array prime_numbers
,但1
is not a prime number。
推荐阅读
- php - PHP替换两个字符串之间的第一个空格(多次出现)
- office-js - 使用 Outlook JS API 访问收件箱中所有邮件项目的方法?
- c++ - 为什么Qt实现返回qint64而不是quint64的QFile::size()
- laravel - 如何为英语和法语字符编写 preg_match?
- java - 使用 RSocketFactory 的替换
- c# - AKS 集群 pod kube 配置位置
- java - 使用带有 Notepad ++ 和 windows cmd 的 pdfbox?
- monitoring - OpenTracing 和 Zipkin 之间的主要区别是什么?
- java - Java 编程 - 基于流程图的编码
- docker - 无法将命令行选项传递给 Gitlab CI 服务?即“-p 4444:4444 -p 5900:5900”