在指针方面,我是一名 C 语言新手。
我正在尝试计算特定用户输入之前的总质数。
首先,我在 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 ,
我该怎么做才能获得相同的输出? 问候。
最佳答案
那是因为
int y[30];
在堆栈上分配作用域本地内存。一旦范围结束(在本例中为函数返回),对该内存的访问将变为未定义。堆栈被 printf
重用并被覆盖。
尝试
int *y = calloc(30, sizeof(int));
通常,如果您希望为数组使用栈,您可以在调用函数中分配它们并将它们传递给填充它的函数:
int* printPrimes(int x, int * y);
在 main
中:
int y[30];
printPrimes(x, y);
关于c - 在 c 中取消引用指针的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22068414/