0

我是初学者。当我发现一些奇怪的东西时,我正在使用指针:

#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 usingprintf("%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);
}
4

2 回答 2

8

您通过返回指向局部变量的指针来调用未定义的行为。函数fun返回后,局部变量占用的空间k不再有效。实际上,之前使用的堆栈空间fun可能会被第一次调用覆盖printf

于 2012-07-17T11:09:23.923 回答
2

您正在返回本地变量的地址fun;一旦fun退出,该变量不再存在,并且指针不再有效。严格来说,行为是未定义的。

最有可能发生的情况是,k在第一次调用printf.

于 2012-07-17T11:12:51.577 回答