Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.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++ 返回指向局部变量的指针_C++_Function_Pointers - Fatal编程技术网

C++ 返回指向局部变量的指针

C++ 返回指向局部变量的指针,c++,function,pointers,C++,Function,Pointers,当函数返回指向局部变量的指针时会发生什么情况 比如说 int* foo() { int local; int* ptr = &local; return ptr; } 编译器会发出警告还是编译并产生意外结果 当函数返回指向局部变量的指针时会发生什么情况 未定义的行为。任何事情都有可能发生。编译器会给你一个警告 这是对该错误的g++警告: g++ -Wall -std=c++11 -O3 test.cpp -o test warning: function ret

当函数返回指向局部变量的指针时会发生什么情况

比如说

int* foo()
{
    int local;
    int* ptr = &local;
    return ptr;
}
编译器会发出警告还是编译并产生意外结果

当函数返回指向局部变量的指针时会发生什么情况

未定义的行为。任何事情都有可能发生。编译器会给你一个警告

这是对该错误的
g++
警告:

g++ -Wall -std=c++11 -O3 test.cpp -o test
warning: function returns address of local variable [-Wreturn-local-addr]

已经提出了类似的问题:

C语言中有些东西留给编译器供应商以他们喜欢的方式实现。这些事物的行为并不是由创造者定义的。编译器供应商可以以他们觉得简单和快速的方式实现这些事情。这属于同一类。该行为未定义,取决于您使用的编译器


还有一件事是使用多个预增量(预减量)和/或后增量(后减量)。当相同的代码在不同的编译器上运行时,您可能会得到不同的输出。

为什么不试试呢?int*foo(){int local=42;int*ptr=&local;return ptr;}int main(){return*(foo());}这应该很明显:局部变量的生命周期就是函数调用。“为什么不试试?”在这种情况下,这实际上是一个糟糕的建议。以前有人问过它,但它是未定义的行为,这意味着尝试它会得到不同的结果。GCC不会给出任何警告,即使使用-Wall-Wextra-Werror@WARhead请阅读这篇关于什么是未定义行为的文章:您应该使用g++for.cpp文件*应该给出警告。静态分析器真的应该给出警告。否则它们真的失败了:)GCC和Clang都警告
return&local,但不适用于
int*p=&local;返回p
cc@EliotB。有关UB的更多信息,请参阅您可以找到所需信息的地方