
我有如下代码,输出两个 3,在函数 f()运行结束后,函数栈中的临时变量 a 指向的空间不会被释放吗?为什么 p 指向的地址空间仍然有效呢?
#include <stdlib.h> #include <stdio.h> int* p = NULL; void f() { int a = 3; p = &a; printf("%d\n", *p); } int man() { f(); printf ("%d\n", *p); return 0; } 1 exch4nge 2018 年 5 月 31 日 语言层面上你应该认为这个地址已经被释放了,所以语言层面上这么写是错的。更底层来讲,这个地址是栈上的地址,即使函数返回,这个地址是有效的,函数返回时出栈也不会清理里面内容,所以看似执行的还正确,不过不能保证在所有编译器与所有编译选项中都正确。如果还好奇的话,可以多去了解汇编。 |
2 Droi 2018 年 5 月 31 日 p 地址与值会被其他值直接覆盖掉,不保证还是原来的值。 详细的可以看 wiki 迷途指针 https://zh.wikipedia.org/wiki/%E8%BF%B7%E9%80%94%E6%8C%87%E9%92%88 |