我是初学者。当我发现奇怪的东西时,我正在使用指针:
#include<stdio.h>
int* fun(int*);
int main()
{
int i=4,*j;
j=fun(&i);
printf("%d ",*j);//gives correct answer -> how??
printf("%d",*j);//gives incorrect answer
}
int* fun(int *i)
{
int k;
k=*i;
return (&k);
}
在main(), I am using
printf(“%d”,* j);`2次。第一个给我正确答案,但第二个不是。为什么?
但这工作正常 - 的#include int * func();
int main()
{
int *p;
p=func();
printf("%u", p);
printf("\n%d", *p);
printf("\n%d", *p);
printf("\n%d", *p);
printf("\n%d", *p);
}
int* func()
{
int i=10;
printf("%u", &i);
printf("\n%d", i);
return (&i);
}
答案 0 :(得分:8)
通过返回指向局部变量的指针来调用未定义的行为。函数fun
返回后,局部变量k
占用的空间不再有效。实际上,fun
之前使用的堆栈空间可能会被第一次调用printf
覆盖。
答案 1 :(得分:2)
您将返回fun
的本地变量的地址;一旦fun
退出,该变量就不再存在,并且指针不再有效。严格地说,行为是不确定的。
最有可能发生的事情是k
曾经占用的内存位置在第一次调用printf
后被覆盖。