假设我们有以下代码
char * fun(){
//some code
return "FooBar";
}
字符串“FooBar”存储在哪里?在数据段或本地堆栈中?如果它存储在堆栈中,指针引用是否会变为无效,因为该字符串将是函数的本地?
答案 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"。某些实现使用这些术语。
字符串文字表示静态存储持续时间的数组,这意味着它在整个程序执行期间存在,并且不限于任何块或函数。