C 局部变量地址可以保留在返回指针的函数中吗

C 局部变量地址可以保留在返回指针的函数中吗,c,C,地址保留在指针m中,并正确打印值。我尝试更改不同的编号。这是因为您的程序调用了未定义的行为。它可以自由打印任何内容(或者崩溃,或者做任何它想做的事情) (也许这就是实际发生的情况:“从内存中删除”这并不意味着保存变量的内存被破坏、点燃或由魔术师使其消失。这只是因为它是无效的。因为它是函数中的一个自动变量,最有可能发生的情况是,当函数返回时堆栈指针被移动,使变量无效但完好无损。不要rel这是一种未定义的行为。当您离开函数时,堆栈没有被清理,因此变量的实际值仍然存在,但您不应该访问它。在显示变量内容

地址保留在指针m中,并正确打印值。我尝试更改不同的编号。

这是因为您的程序调用了未定义的行为。它可以自由打印任何内容(或者崩溃,或者做任何它想做的事情)


(也许这就是实际发生的情况:“从内存中删除”这并不意味着保存变量的内存被破坏、点燃或由魔术师使其消失。这只是因为它是无效的。因为它是函数中的一个自动变量,最有可能发生的情况是,当函数返回时堆栈指针被移动,使变量无效但完好无损。不要rel这是一种未定义的行为。当您离开函数时,堆栈没有被清理,因此变量的实际值仍然存在,但您不应该访问它。在显示变量内容之前,请尝试调用另一个函数。尝试使用
-O3
编译可能不同的行为。

您可以通过声明
static int a=-1使返回值“可靠”
这将使
a
即使在您从函数返回后仍然保持不变。。。但在很多情况下这真的是个坏主意。。。特别是当你要成为多线程的时候

也就是说。。。返回指向临时(局部)变量的指针将在运行时造成严重破坏。所以,你永远都不想这么做。。。你需要使它成为一个静态的局部或找到一个更好的方法来处理它


编辑后扩展答案:当您将
-1
指定给
a
作为局部变量时,实际上是将
-1
存储在堆栈上的某个位置,并且
&a
指向该位置。从函数返回时,堆栈不会被销毁,但行为现在未定义,因为虽然地址是有效指针,但该地址的内容可能已被修改。。。例如,如果调用另一个在堆栈上推送数据和/或声明局部变量的函数,它们很可能已经覆盖了您期望的值。此外,谁知道优化器可能注入了什么疯狂。所以如果你碰巧在其他任何东西弄脏它之前读取了该值,它可能会起作用。。。但是您不能保证它会工作,而且它通常会因实现的不同而不同。

退出函数后,返回的指针将无效。这是一种未定义的行为

保留的指针指向内存中的某个位置,您无权再对其进行读/写操作

要保持地址有效,请使用
static
变量

 return from if a : 0xbfd8cf14

 m ; 0xbfd8cf14 m : 20

标记C++,但完全相关:@克里斯:链接有一个很好的解释。谢谢。酒店房间的答案在这里有点有名。可能是重复的
 return from if a : 0xbfd8cf14

 m ; 0xbfd8cf14 m : 20
static int a = -1;
// ...
return &a;