哪个段是存储函数本地的字符串常量?

时间:2016-06-15 06:08:43

标签: c pointers memory-management

假设我们有以下代码

char * fun(){
    //some code
    return "FooBar";
}

字符串“FooBar”存储在哪里?在数据段或本地堆栈中?如果它存储在堆栈中,指针引用是否会变为无效,因为该字符串将是函数的本地?

2 个答案:

答案 0 :(得分:4)

它的可能(虽然不一定)与所有其他字符串常量一起存储在只读部分中,而"FooBar"只是解析为该字符串的地址,像(伪汇编语言):

.sect readonly
    foobar  ds 'FooBar', 0             ; constant strings
.sect code
    fun:    load retreg, &foobar       ; load address of it
            retn                       ; and just return

但是,由于标准指定了 nothing 关于存储内容的地方,这完全取决于实现。该标准倾向于规定行为而不是实现该行为的基础方法。

这种情况下的行为由ISO C11 6.4.5 String literals第6节(我的斜体)决定:

  

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

它是静态存储持续时间这一事实意味着它在整个程序期间存在,按5.1.2 Execution Environments

  

应初始化具有静态存储持续时间的所有对象(设置为它们的   程序启动前的初始值。

第3节中的

6.2.4 Storage durations of objects,讨论静态存储持续时间:

  

它的生命周期是程序的整个执行,它的存储值只在程序启动之前初始化一次。

答案 1 :(得分:0)

C语言标准不使用" segment"等术语。或" stack"。某些实现使用这些术语。

字符串文字表示静态存储持续时间的数组,这意味着它在整个程序执行期间存在,并且不限于任何块或函数。