我有如下代码,输出两个 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 main()
{
f();
printf ("%d\n", *p);
return 0;
}
1
exch4nge 2018-05-31 15:18:12 +08:00
语言层面上你应该认为这个地址已经被释放了,所以语言层面上这么写是错的。更底层来讲,这个地址是栈上的地址,即使函数返回,这个地址是有效的,函数返回时出栈也不会清理里面内容,所以看似执行的还正确,不过不能保证在所有编译器与所有编译选项中都正确。如果还好奇的话,可以多去了解汇编。
|
2
Droi 2018-05-31 16:07:35 +08:00
p 地址与值会被其他值直接覆盖掉,不保证还是原来的值。
详细的可以看 wiki 迷途指针 https://zh.wikipedia.org/wiki/%E8%BF%B7%E9%80%94%E6%8C%87%E9%92%88 |