C++ 指针可以指向局部变量';它之外的内存';什么范围? void foo(int**ptr){ int值=4; *ptr=&value; //**ptr=数值; } 内部主(空){ int值=7; int*ptr=&value; foo&ptr; cout
正式答案:未定义的行为C++ 指针可以指向局部变量';它之外的内存';什么范围? void foo(int**ptr){ int值=4; *ptr=&value; //**ptr=数值; } 内部主(空){ int值=7; int*ptr=&value; foo&ptr; cout,c++,c,pointers,C++,C,Pointers,正式答案:未定义的行为 实用答案:堆栈上没有其他操作可以覆盖该值。因为您返回一个指向局部变量的指针,这是未定义的行为。这包括“出现”工作,但在一般情况下依赖它是一个糟糕的想法 在这种特定情况下,该值保留在堆栈上,生成的代码似乎在调用foo之后和任何其他函数调用之前获取*ptr。因此,该值没有被任何其他函数调用覆盖 如果您要在foo(&ptr)和cout强制链接之间插入函数调用,它仍然需要显示一些内容,并且4与其他任何内容一样有效。地址的值在其他内容更改之前不会更改。“仅为您使用的内容付费。”分配
实用答案:堆栈上没有其他操作可以覆盖该值。因为您返回一个指向局部变量的指针,这是未定义的行为。这包括“出现”工作,但在一般情况下依赖它是一个糟糕的想法 在这种特定情况下,该值保留在堆栈上,生成的代码似乎在调用
foo
之后和任何其他函数调用之前获取*ptr
。因此,该值没有被任何其他函数调用覆盖
如果您要在
foo(&ptr)
和cout强制链接之间插入函数调用,它仍然需要显示一些内容,并且4与其他任何内容一样有效。地址的值在其他内容更改之前不会更改。“仅为您使用的内容付费。”分配和使用该内存的下一件事将改变它的值,但在此之前,该值仍然是4
,因为堆栈尚未修改,因此您得到相同的变量,如果再次运行它,并且这次的值=3,那么输出将是3,但如果堆栈上还有其他内容,则将是(int)该字节的值。@dlf从技术上讲,它不必显示任何内容。它可以取代它来显示你的硬盘。
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;
}