指针可以将局部变量的内存指向其范围之外?

Pointer can point local variable's memory outside it's scope?

本文关键字:范围 内存 局部变量 指针      更新时间:2023-10-16
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而不是一些垃圾值?

正式回答:未定义行为。

实际答案:堆栈上还没有其他操作覆盖该值。

因为返回的是指向局部变量的指针,所以这是未定义的行为。这包括"看起来"可以工作,但在一般情况下依赖它是一个糟糕的主意。

在这个特定的例子中,值留在堆栈上,并且似乎生成的代码在调用foo之后,在任何其他函数调用之前获取*ptr。因此,该值没有被任何其他函数调用覆盖。

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