指针可以将局部变量n#39; s内存指向它的范围之外?

时间:2014-08-14 18:13:16

标签: c++ c pointers

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 = 4foo返回后不再有效/超出范围,为什么*ptr显示4而不是某些垃圾值?

2 个答案:

答案 0 :(得分:6)

正式答案:未定义的行为。

实际答案:堆栈上的其他操作尚未覆盖该值。

答案 1 :(得分:3)

因为您正在返回指向局部变量的指针,所以这是未定义的行为。这包括&#34;出现&#34;工作,但在一般情况下依赖它是一个可怕的想法。

在这种特定情况下,该值保留在堆栈上,并且在调用*ptr之后,以及在任何其他函数调用之前,生成的代码似乎都会获取foo。因此,该值未被任何其他函数调用覆盖。

如果您要在foo(&ptr)cout << ...语句之间插入函数调用,则该值很可能是垃圾。