6 回答
翻阅古今
TA贡献1780条经验 获得超5个赞
你在这里做的只是读取和写入曾经是地址的内存a
。既然你在外面foo
,它只是指向一些随机存储区的指针。事实上,在您的示例中,该内存区域确实存在,此刻没有其他任何内容正在使用它。你不会因为继续使用它而破坏任何东西,而其他任何东西都没有覆盖它。因此,5
仍然存在。在一个真实的程序中,该内存几乎可以立即重用,你可以通过这样做来破坏某些东西(尽管这些症状可能要到很晚才出现!)
当您返回时foo
,您告诉操作系统您不再使用该内存,并且可以将其重新分配给其他内容。如果你很幸运,它永远不会被重新分配,并且操作系统不会让你再次使用它,那么你就可以逃脱谎言。尽管如此,你最终还是会写完最后的那个地址。
现在,如果你想知道编译器为什么不抱怨,那可能是因为foo
优化消除了。它通常会警告你这类事情。C假设你知道你正在做什么,从技术上来说你没有违反范围(除了a
它之外没有引用foo
),只有内存访问规则,它只触发警告而不是错误。
简而言之:这通常不会起作用,但有时会偶然发生。
至尊宝的传说
TA贡献1789条经验 获得超10个赞
所有答案的一点点补充:
如果你做那样的事情:
#include<stdio.h>#include <stdlib.h>int * foo(){ int a = 5; return &a;}void boo(){ int a = 7;}int main(){ int * p = foo(); boo(); printf("%d\n",*p);}
输出可能是:7
这是因为从foo()返回后,堆栈被释放,然后由boo()重用。如果您拆卸可执行文件,您将清楚地看到它。
- 6 回答
- 0 关注
- 749 浏览
添加回答
举报
0/150
提交
取消