局部变量至少(最多)存在于函数内部。但是,块外的块范围变量会发生什么,但它具有相同的功能,我可以保留并使用它们的地址吗?这段代码有效吗?
#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
吗?它可能是适当的解决方案,但在我看来,它不是一个线程安全的?
答案 0 :(得分:9)
不,你不能。具有自动存储持续时间的变量将其生命周期设置为封闭块。你最终得到的是一个悬空引用,使用它是未定义的行为。
对象的生命周期是程序执行的一部分,在此期间保证为其保留存储。一个对象存在,具有一个常量地址,33)并在其整个生命周期内保留其最后存储的值.34)如果一个对象在其生命周期之外被引用,则该行为是未定义的。当指针指向(或刚刚过去)的对象到达其生命周期的末尾时,指针的值变得不确定。
对于没有可变长度数组类型的对象(具有自动存储持续时间),其生命周期从入口延伸到与其关联的块,直到该块的执行结束为止无论如何。