对输出感到困惑

时间:2012-06-22 07:25:11

标签: c printf local-variables

为什么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

4 个答案:

答案 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,并且内存地址也可以在函数外部读取

相关问题