当涉及到指针时,我是一名新手程序员。
我试图计算直到特定用户输入的总素数。
首先,我在main函数中输入并将其传递给printPrimes
函数。在新函数中,我计算素数并将它们存储在一个数组中,最后将指针传递给main函数。
我的问题是,为什么我在main
函数和printPrimes
中的其他函数中得到两个循环的不同输出。
我的代码是:
#include <stdio.h>
int* printPrimes(int x)
{
int i;
int j;
int y[30];
int dummy=0;
int count=0;
int *p = malloc(30*sizeof(*p));
for(i; i<=x; i++)
{
for(j=2; j<i ;j++)
{
dummy=(i % j);
if(dummy == 0)
{
break;
}
}
if (dummy != 0 || i==2)
{
y[count]=i;
count++;
}
}
p=y;
for(i=0;i<=30;i++)
{
printf("%d , ",*(p+i)); //LOOP1
}
printf("\n");
return p;
}
void main()
{
int x;
int *q;
int j;
int i;
printf("enter the value of x , the number upto which you want primes");
scanf("%d",&x);
q=printPrimes(x);
for(i=0;i<=30;i++)
{
printf("%d , ",*(q+i)); //LOOP2
}
}
输出结果为:
enter the value of x , the number upto which you want primes23
2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 110 , 0 , 0 , -298634272 , 32767 , 4195536 , 0 , -298634048 , 32767 , 2108875317 , 32711 , 0 , 0 , 1024 , 0 , -298634280 , 32767 , -298634280 , 32767 , 4196485 , 0 , -298634448 ,
2 , 606348324 , 3 , 0 , 11 , 13 , 17 , 19 , 23 , 110 , 0 , 0 , -298634272 , 32767 , 4195536 , 0 , -298634048 , 32767 , 2108875317 , 32711 , 0 , 0 , 1024 , 0 , -298634280 , 32767 , -298634280 , 32767 , 4196485 , 0 , -298634448 ,
如何获得相同的输出? 问候。
答案 0 :(得分:3)
那是因为
int y[30];
在堆栈上分配范围本地内存。一旦范围结束(在这种情况下函数返回),对该存储器的访问将变为未定义。堆栈被printf
重用并被覆盖。
尝试
int *y = calloc(30, sizeof(int));
通常,如果您希望对数组使用堆栈,请在调用函数中分配它们并将它们传递给填充它的函数:
int* printPrimes(int x, int * y);
main
中的:
int y[30];
printPrimes(x, y);
答案 1 :(得分:1)
您的问题是尝试进行数组复制:
p=y;
这实际上只覆盖了新分配的内存的地址,其中(堆栈)地址为y
。它不会复制数组元素,这可能就是您的意图。
你需要:
memcpy(p, y, 30*sizeof *p);
或者完全停止使用y
,并在任何地方使用p
。返回malloc()
ed指针是完全正常和安全的。请记住,当不再需要内存时,调用free()
成为调用者的责任。