C变量的范围[重复](Scope of C variables [duplicate])

2019-06-27 10:17发布

可能重复:
从功能安全和便携返回一个字符串的地址?
“终身”的字符串用C字面

你好,我是有点困惑

char *func()
 {

    return "Hello";
 }

这里的“Hello”是一个字符序列/阵列。 这是一个局部变量,它必须尽快消散的函数返回。 那为什么我们能够得到正确的值?

Answer 1:

"Hello"是一个字符串文字,将存在于程序的生命周期。 引述C99标准的相关章节:

  • 6.4.5字符串常量

...该多字节字符序列然后用于初始化静态存储持续时间和长度刚好足以包含序列的阵列...

  • 对象存储6.2.4持续时间

其标识符的对象被声明与外部或内部的键,或者与存储类说明静态具有静态存储持续时间 。 其寿命是该程序的整个执行和其存储的值被初始化仅仅一次,编程启动之前。

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



Answer 2:

这是恒定的,在存储器常数地址。



Answer 3:

该功能仅在返回控制后销毁值。

所以,到时候遇到return语句中的“Hello”被放置于返回值,那么函数破坏范围;



Answer 4:

看看这个: 从功能安全和便携返回一个字符串的地址?

即使字符串被删除(使用malloc()和free局部变量或中对动态分配()),当你返回一个指针,该值可以是正确的。 但是,这是一个undifined行为。



文章来源: Scope of C variables [duplicate]
标签: c scope heap local