当C'释放'本地堆栈变量?

Nic*_*ick 4 c variables pointers

局部变量至少(最多)存在于函数内部.但是,块外的块范围变量会发生什么,但它具有相同的功能,我可以保留并使用它们的地址吗?这段代码有效吗?

#include <stdio.h>

int main()
{
   char *f;
   if (1)
   {
       char q[] = "123";
       f = q;   
   }

   printf ("%s\n", f);   
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

事实上gcc -ansi -pedantic,valgrind和valgrind 都没有抱怨,但是我可以使用跨平台和交叉编译吗?在我看来没有,但是什么工具可以告诉我错误?

PS我应该用static吗?它可能是适当的解决方案,但在我看来,它不是一个线程安全的?

Sto*_*ica 9

你不能.具有自动存储持续时间的变量将其生命周期设置为封闭块.你最终得到的是一个悬空引用,使用它是未定义的行为.

[C11§6.2.42]

对象的生命周期是程序执行的一部分,在此期间保证为其保留存储.一个对象存在,具有一个常量地址,33)并在其整个生命周期内保留其最后存储的值.34)如果一个对象在其生命周期之外被引用,则该行为是未定义的.当指针指向(或刚刚过去)的对象到达其生命周期的末尾时,指针的值变得不确定.

[C11§6.2.46]

对于没有可变长度数组类型的此类对象(具有自动存储持续时间),其生命周期从条目延伸到与其关联的块,直到该块的执行以任何方式结束.

  • @CIsForCookies - 说它未定义的行为意味着C标准不要求编译器生成一致的正确代码,甚至不需要正确的代码. (2认同)