为什么printf打印7虽然变量a是函数fun()的局部变量,但一旦控件从函数fun()返回就不再存在。
这是c代码
#include<stdio.h>
main()
{
int *fun();
int *c=fun();
printf("%d",*c);
getch();
}
int *fun()
{
int a=7;
return(&a);
}
输出:7
答案 0 :(得分:6)
这是因为即使变量不再存在,它所在的内存位置还没有用于其他内容。因此,指针仍指向存储器位置,其中位包含值{7}的int
。
但这肯定是未定义的行为。你不应该依赖它。
答案 1 :(得分:1)
语言习语和硬件的物理操作之间存在差异。在&#34; C&#34;单词,是的,你的变量不应再被访问,但物理上变量a
已经分配到你的程序堆栈上,每次函数返回时都不会被删除(这需要花费太多时间),因此你仍然可以阅读它。
无论如何,建议不要这样做,因为其他函数调用可能会删除此数据。
答案 2 :(得分:1)
一旦fun()返回,帧指针就被设置回来再次指向main()帧。指针c指向内存中的某个地址,因为fun()已经返回,我们不知道地址中有什么,但如果没有其他内容写入地址,它仍然可以是前一个变量a。 C标准只是在函数返回时移动帧指针。
答案 3 :(得分:0)
我认为是因为你正在打印* c,它会显示存储在该位置的值,即&a; a,只要尝试打印c,那么你将得到7的地址。
这是因为地址已经传递给变量c,并且内存地址也可以在函数外部读取