当C' deallocates'本地堆栈变量?

时间:2017-04-18 08:54:59

标签: c pointers variables

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

#include <stdio.h>

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

   printf ("%s\n", f);   
   return 0;
}

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

P.S。毕竟我应该使用static吗?它可能是适当的解决方案,但在我看来,它不是一个线程安全的?

1 个答案:

答案 0 :(得分:9)

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

[C11 §6.2.4 ¶2]

  

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

[C11 §6.2.4 ¶6]

  

对于没有可变长度数组类型的对象(具有自动存储持续时间),其生命周期从入口延伸到与其关联的块,直到该块的执行结束为​​止无论如何。