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的更多信息,请参阅您可以找到所需信息的地方