为什么返回带有字符串文字的const char *的函数有效?

New*_*Bee 5 c malloc libcurl

我在libcurl中找到了如下代码

const char *
curl_easy_strerror(CURLcode error)
{
  switch(error) {
  case CURLE_OK:
    return "No error";

  case CURLE_UNSUPPORTED_PROTOCOL:
    return "Unsupported protocol";
.....
}
Run Code Online (Sandbox Code Playgroud)

据我所知,如果要返回指针,则需要确保指针所指向的内存不会被更改或释放。为什么此libcurl代码有效?

cj.*_*ter 10

这些字符串文字在编译时放在可执行文件的静态只读部分中。它们与堆或堆栈分开。该函数只是返回一个指向这些字符串的指针。

参考

它的实现是特定于平台和编译器的,但是C11标准在6.4.5节中对此有一些相关要求。

在转换阶段7中,一个或多个字符串文字产生的每个多字节字符序列将附加一个零值的字节或代码。然后,多字节字符序列用于初始化一个足以包含该序列的静态存储持续时间和长度数组。

因此,我们知道它必须在编译时存储在静态位置。

如果程序尝试修改这样的数组,则行为是不确定的。

这告诉我们数据必须是只读的。

编辑

有些人以特定的平台或体系结构为由,抱怨这是不正确的。如上所述,这是平台和编译器特定的

某些平台可能不支持只读数据,但是编译器几乎肯定会尝试阻止您对其进行修改。由于行为是未定义的,因此目的是您永远不要这样做,因此对于所有目的和目的而言,数据都是只读的。

在问题的上下文中,此答案是正确的。

  • 这个问题在最重要的地方是正确的:保证了静态存储的持续时间,并且用户必须将文字视为只读。所有部分内容和堆栈/堆内容都是实现定义的,与实际答案无关。我可能会使用几乎没有什么不同的措词,但总的来说,答案很好。 (2认同)