像这样使用constchar*返回字符串合法吗

Is it legal to return a string using `const char *` like this?

本文关键字:字符串 返回 constchar 像这样      更新时间:2023-10-16

下面是从这个线程更改的代码:如何在我的C代码中返回字符串?

#include <stdio.h>
const char * getString();
int main()
{
 printf("hello worldn");
 printf("%sn", getString());
 printf("%sn", getString2());
 return 0;
}
const char * getString()
{
 const char *x = "abcstring";
 return x;
}
const char * getString2()
{
 return "abcstring";
}

这看起来有点让我困惑,因为xgetString中指向的内存空间"abcstring"似乎在堆栈上,而不是堆上。因此,为x分配的存储器可以在getString结束时被释放。如果是,printf("%sn", getString());会失败吗?

那么printf("%sn", getString2());呢?

为x分配的内存可以在getString结束时释放

是的,但仅对于x,字符串文字不会。

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

根据C++标准,$2.13.5/8字符串文本[lex.String](我用粗体表示)

还引用了普通字符串文字和UTF-8字符串文字到作为窄字符串文字。窄字符串文字的类型为"array"of n const char",其中n是如下定义的字符串的大小,并且具有静态存储持续时间(3.7)

对于C字符串文字,

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