C变量的范围

可能重复:
从函数安全和可移植返回字符串文字地址?
C语言中字符串文字的“生命周期”

您好我有点困惑

char *func() { return "Hello"; } 

这里“Hello”是字符序列/数组。 它是一个局部变量,一旦函数返回它就必须消失。 那我们怎么能得到正确的价值呢?

"Hello"是一个字符串文字,将在程序的生命周期中存在。 引用C99标准的相关部分:

  • 6.4.5字符串文字

…然后使用多字节字符序列初始化静态存储持续时间和长度的数组,足以包含序列…

  • 6.2.4对象的存储持续时间

标识符使用外部或内部链接声明的对象,或者使用存储类说明符static声明的对象具有静态存储持续时间 。 它的生命周期是程序的整个执行,它的存储值只在程序启动之前初始化一次。

函数的返回值应该是const char*因为尝试修改字符串文字是未定义的行为。

它是常量并且在内存中具有恒定的地址。

该函数仅在返回控件后才会破坏值。

因此,在遇到return语句时,将“Hello”置于返回值,然后该函数销毁范围;

看看这个: 从函数安全和可移植返回一个字符串文字地址?

即使字符串被删除(使用malloc()和free()的局部变量或动态分配),当您返回指针时,该值也可以是正确的。 但是,这是一种不确定的行为。