可能重复:
可以在其范围之外访问局部变量的内存吗?
第二个问题是printf什么?
#include<stdio.h>
int* fun() {
int a =10;
return &a;
}
int main() {
int *a;
a = fun();
printf("%d",*a);
printf("%d",*a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我已经返回了局部变量的地址并将其传递给了printf.它第一次正确打印为"10",但第二次显示垃圾值.
如果最初a是指向地址的悬空指针10,为什么不是第二次呢?
有谁能解释一下?
我甚至printf在第一次调用之前尝试调用其他函数,但我仍然得到相同的输出.
在BeniBela的回答之后我尝试了这个...
#include<stdio.h>
int* fun()
{
int a =10;
return &a;
}
void fun2(int d)
{
int a,b,c;
}
int main()
{
int *a,b;
a = fun();
fun2(5);
printf("%d",*a);
printf("%d",*a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
仍然相同的输出.. :(
没有问题printf,您的代码有一个未定义的行为.
您返回函数本地变量的地址,变量的生命周期仅限于函数的作用域({,}),一旦函数的作用域结束,变量就存在更长.标准不需要变量存在了.
所以你的指针引用了一些不存在的东西(虽然它可能).简单地说,它是未定义的行为,你是编译器的怜悯,它可能会向你展示任何行为,并没有提供相同的解释.