以下代码从此主题改变了一点:Doppelganger
#include <stdio.h>
const char * getString();
int main()
{
printf("hello world\n");
printf("%s\n", getString());
printf("%s\n", getString2());
return 0;
}
const char * getString()
{
const char *x = "abcstring";
return x;
}
const char * getString2()
{
return "abcstring";
}
这对我来说有点让人困惑,因为x
中"abcstring"
指向getString
的内存空间似乎是堆栈而不是堆栈。因此,x
的已分配内存可能会在getString
结束时释放。如果是这样,printf("%s\n", getString());
会失败吗?
那么printf("%s\n", getString2());
呢?
答案 0 :(得分:3)
x的分配内存可以在getString
的末尾释放
是的,但只适用于x
,string literal赢了。
字符串文字具有静态存储持续时间,因此存在于程序生命周期的内存中。
根据C ++标准,$ 2.13.5 / 8字符串文字[lex.string](由我加粗)
也引用普通的字符串文字和UTF-8字符串文字 作为窄字符串文字。窄字符串文字的类型为“数组” of n const char“,其中n是下面定义的字符串的大小, 并且静态存储时间(3.7)。
对于C string literal,
然后(在第7阶段),向每个字符添加一个终止空字符 字符串文字,然后每个文字初始化一个未命名的数组 静态存储持续时间和长度足以包含 字符串文字的内容加上一个空终止符。