Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针可以指向局部变量';它之外的内存';什么范围? void foo(int**ptr){ int值=4; *ptr=&value; //**ptr=数值; } 内部主(空){ int值=7; int*ptr=&value; foo&ptr; cout_C++_C_Pointers - Fatal编程技术网

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;
}