void foo(int** ptr) {
int value = 4;
*ptr = &value;
// **ptr = value;
}
int main(void) {
int value = 7;
int* ptr = &value;
foo(&ptr);
cout << *ptr << endl; // 4
return 0;
}
我的问题是 - 由于value = 4
从foo
返回后不再有效/超出范围,为什么*ptr
显示4
而不是某些垃圾值?
答案 0 :(得分:6)
正式答案:未定义的行为。
实际答案:堆栈上的其他操作尚未覆盖该值。
答案 1 :(得分:3)
因为您正在返回指向局部变量的指针,所以这是未定义的行为。这包括&#34;出现&#34;工作,但在一般情况下依赖它是一个可怕的想法。
在这种特定情况下,该值保留在堆栈上,并且在调用*ptr
之后,以及在任何其他函数调用之前,生成的代码似乎都会获取foo
。因此,该值未被任何其他函数调用覆盖。
如果您要在foo(&ptr)
和cout << ...
语句之间插入函数调用,则该值很可能是垃圾。