在c中取消引用指针时的不同值
说到指针,我是一个c程序员新手。 我试图计算总质数,直到一个特定的用户输入。 首先,我在主函数中获取输入并将其传递给在c中取消引用指针时的不同值,c,pointers,C,Pointers,说到指针,我是一个c程序员新手。 我试图计算总质数,直到一个特定的用户输入。 首先,我在主函数中获取输入并将其传递给printPrimes函数。在新函数中,我计算素数并将它们存储在数组中,最后将指针传递给主函数。 我的问题是,为什么我得到两个循环的不同输出,一个在main函数中,另一个在printPrimes中。 我的代码是: #include <stdio.h> int* printPrimes(int x) { int i; int j; int y[
printPrimes
函数。在新函数中,我计算素数并将它们存储在数组中,最后将指针传递给主函数。
我的问题是,为什么我得到两个循环的不同输出,一个在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
}
}
要获得相同的输出,我可以做些什么?
问候。那是因为
int y[30];
在堆栈上分配作用域本地内存。一旦作用域结束(在本例中为函数return),对该内存的访问将变得未定义。堆栈被printf
重用并覆盖
试一试
通常,如果希望对数组使用堆栈,请在调用的函数中分配堆栈,并将其传递给填充堆栈的函数:
int* printPrimes(int x, int * y);
在main
中:
int y[30];
printPrimes(x, y);
那是因为
int y[30];
在堆栈上分配作用域本地内存。一旦作用域结束(在本例中为函数return),对该内存的访问将变得未定义。堆栈被printf
重用并覆盖
试一试
通常,如果希望对数组使用堆栈,请在调用的函数中分配堆栈,并将其传递给填充堆栈的函数:
int* printPrimes(int x, int * y);
在main
中:
int y[30];
printPrimes(x, y);
您的问题是试图通过以下方式复制阵列:
p=y;
实际上,这只会用y
的(堆栈)地址覆盖新分配内存的地址。它不会复制数组元素,这可能是您想要的
你需要:
memcpy(p, y, 30*sizeof *p);
或者干脆停止使用
y
,然后到处使用p
。返回malloc()
ed指针是完全正常和安全的。请记住,当不再需要内存时,调用free()
是调用方的责任。您的问题是试图通过以下方式复制数组:
p=y;
实际上,这只会用y
的(堆栈)地址覆盖新分配内存的地址。它不会复制数组元素,这可能是您想要的
你需要:
memcpy(p, y, 30*sizeof *p);
或者干脆停止使用
y
,然后到处使用p
。返回malloc()
ed指针是完全正常和安全的。只要记住,当不再需要内存时,调用free()
就成了调用方的责任。看起来这个项目是为了学习指针的使用。您还应该了解的一个重要细节是关于内存泄漏。。。虽然误用的指针通常(太)容易发现,但了解内存泄漏并知道如何修复它们有时仍然很微妙。1)返回局部值。2) 总是高达30。3) i当p被分配内存时,不需要为y分离数组。看起来这个项目是为了学习指针的使用。您还应该了解的一个重要细节是关于内存泄漏。。。虽然误用的指针通常(太)容易发现,但了解内存泄漏并知道如何修复它们有时仍然很微妙。1)返回局部值。2) 总是高达30。3) i当p已分配内存时,不需要为y分离数组。