1

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

4 回答 4

6

这是因为即使变量不再存在,它所在的内存位置也尚未用于其他用途。int因此,指针仍然指向位包含值为 7的内存位置。

但这绝对是未定义的行为。你不应该依赖它

于 2012-06-22T07:28:45.560 回答
1

语言习语和硬件的物理操作是有区别的。用“C”的话来说,是的,你的变量不应该再被访问了,但实际上变量a已经分配在你的程序的堆栈上,每次函数返回时都不会删除它(这会花费太多时间),因此你仍然可以阅读它。

无论如何,不​​建议这样做,因为其他函数调用可能会删除此数据。

于 2012-06-22T07:31:33.363 回答
1

一旦 fun() 返回,帧指针已被设置回指向 main() 帧。指针 c 指向内存中的某个地址,由于 fun() 已经返回,我们不知道地址中的内容,但如果没有其他内容写入地址,它仍然可以是之前的变量 a。C 标准只是在函数返回时移动帧指针。

于 2012-06-22T07:42:26.560 回答
0

我认为这是因为您正在打印 *c ,它显示了存储在该位置的值,即 &a ,只需尝试打印 c 然后您将获得 7 的地址。

这是因为地址已经传递给变量 c 并且内存地址也可以在函数外部读取

于 2012-06-22T07:31:29.517 回答