使用`const char *`返回字符串是否合法?

时间:2016-01-11 03:25:48

标签: c++ c memory char

以下代码从此主题改变了一点: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());呢?

1 个答案:

答案 0 :(得分:3)

  

x的分配内存可以在getString

的末尾释放

是的,但只适用于xstring literal赢了。

  

字符串文字具有静态存储持续时间,因此存在于程序生命周期的内存中。

根据C ++标准,$ 2.13.5 / 8字符串文字[lex.string](由我加粗)

  

也引用普通的字符串文字和UTF-8字符串文字   作为窄字符串文字。窄字符串文字的类型为“数组”   of n const char“,其中n是下面定义的字符串的大小,   并且静态存储时间(3.7)。

对于C string literal

  

然后(在第7阶段),向每个字符添加一个终止空字符   字符串文字,然后每个文字初始化一个未命名的数组   静态存储持续时间和长度足以包含   字符串文字的内容加上一个空终止符。