C变量的范围
可能重复:
从函数安全和可移植返回字符串文字地址?
C语言中字符串文字的“生命周期”
您好我有点困惑
char *func() { return "Hello"; }
这里“Hello”是字符序列/数组。 它是一个局部变量,一旦函数返回它就必须消失。 那我们怎么能得到正确的价值呢?
"Hello"
是一个字符串文字,将在程序的生命周期中存在。 引用C99标准的相关部分:
- 6.4.5字符串文字
…然后使用多字节字符序列初始化静态存储持续时间和长度的数组,足以包含序列…
- 6.2.4对象的存储持续时间
标识符使用外部或内部链接声明的对象,或者使用存储类说明符static声明的对象具有静态存储持续时间 。 它的生命周期是程序的整个执行,它的存储值只在程序启动之前初始化一次。
函数的返回值应该是const char*
因为尝试修改字符串文字是未定义的行为。
它是常量并且在内存中具有恒定的地址。
该函数仅在返回控件后才会破坏值。
因此,在遇到return语句时,将“Hello”置于返回值,然后该函数销毁范围;
看看这个: 从函数安全和可移植返回一个字符串文字地址?
即使字符串被删除(使用malloc()和free()的局部变量或动态分配),当您返回指针时,该值也可以是正确的。 但是,这是一种不确定的行为。