【发布时间】:2016-04-13 20:18:11
【问题描述】:
我现在学习cpp一个月了,我一直认为函数内部的变量,在堆栈上初始化,不能从函数范围之外访问。但是,当我使用指向函数成员的全局指针时,情况似乎并非如此:
#include <iostream>
void fun(void); int *pInt;
int main(int argc, char **argv) {
pInt = 0;
fun();
std::cout << "*pInt = " << *pInt << std::endl;
return 0;
}
void fun(void) {
int a = 3;
pInt = &a;
}
编译和运行它不会产生任何错误,并且确实会打印出预期的结果。 为什么会这样?在函数 fun 超出范围后,“a”是否应该超出范围(以及它的值)?
【问题讨论】:
-
这称为dangling pointer。请参阅诸如 this 之类的问题,这些问题已在 SO 上得到解答。
-
编译器不会生成故意破坏 pInt 指向的内存内容的代码,只是当 a 超出范围时,所有关于内存会发生什么的赌注都没有了pInt 指向。也许由于其他操作会覆盖它,它会变成垃圾,也许不会 - 但是您应该始终假设访问此内存不会给您期望的结果。