Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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++的基础知识,尝试下面的代码行, int& func() { int localnum = 10; return localnum; } int main() { int &i = func(); cout<<"value : "<<i<<endl; cout<<"value : "<<i<<endl; return 0; } int&func() { int localnum=10; 返回localnum; } int main() { int&i=func(); cout_C++ - Fatal编程技术网

返回对局部变量的引用及其行为 我只是在使用C++的基础知识,尝试下面的代码行, int& func() { int localnum = 10; return localnum; } int main() { int &i = func(); cout<<"value : "<<i<<endl; cout<<"value : "<<i<<endl; return 0; } int&func() { int localnum=10; 返回localnum; } int main() { int&i=func(); cout

返回对局部变量的引用及其行为 我只是在使用C++的基础知识,尝试下面的代码行, int& func() { int localnum = 10; return localnum; } int main() { int &i = func(); cout<<"value : "<<i<<endl; cout<<"value : "<<i<<endl; return 0; } int&func() { int localnum=10; 返回localnum; } int main() { int&i=func(); cout,c++,C++,由于intlocalnum的作用域是func函数,因此实际上您返回的是对函数返回后不再可用的某个对象的引用,这是未定义的行为,这意味着任何事情都是可能的。实际发生的情况取决于编译器的实现。如果您纯粹是出于但在语言中,这只是未定义的行为,所以理论上结果可能是任何东西 根据您对实现的推理,不需要另一个进程来覆盖通常在堆栈中分配的局部变量。除此之外,对另一个函数的任何调用都可以。在这种情况下,您第一次调用操作符 我认为,即使func()执行完成,localnum的值仍将保持不变,并且不会被销毁,直到任

由于intlocalnum的作用域是func函数,因此实际上您返回的是对函数返回后不再可用的某个对象的引用,这是未定义的行为,这意味着任何事情都是可能的。实际发生的情况取决于编译器的实现。

如果您纯粹是出于但在语言中,这只是未定义的行为,所以理论上结果可能是任何东西

根据您对实现的推理,不需要另一个进程来覆盖通常在堆栈中分配的局部变量。除此之外,对另一个函数的任何调用都可以。在这种情况下,您第一次调用
操作符
我认为,即使func()执行完成,localnum的值仍将保持不变,并且不会被销毁,直到任何进程使用内存空间(但设置一些位/标志,以便剩余进程将此内存块视为空闲并可以使用它)-如果我错了,请更正我

由于这是一个UB,您的解释并不完全正确。一些编译器可能会设置位/标志,而另一些编译器可能会将值设置为零……因为UB给每个编译器自由地执行它喜欢的操作。您的解释只是众多解释中的一个(尽管我认为这是最常见的解释)

我的问题是,我没有在这些打印之间运行任何进程,但值仍在更改。这意味着我系统中的任何其他进程都在这些打印之间使用localnum的内存区域


如果您的进程没有这样做,并且值被更改,那么,是的,其他人正在更改值。请注意,即使您没有直接更改该地址中的值,您的代码的实现方式也可能会在背后更改它(使用它是未定义的行为,因此该行为可以是任何行为。尝试对此进行推理没有太多意义-基本上,您返回一个可重用的内存位置引用(因为对象的生存期已结束)。如何重用它是任意的。局部变量通常在堆栈上分配,编译器使用堆栈执行各种操作,例如调用输出函数。您是否知道