C-为什么用字符串文字返回const char *的函数工作



我在libcurl中找到了代码,看起来像:

const char *
curl_easy_strerror(CURLcode error)
{
  switch(error) {
  case CURLE_OK:
    return "No error";
  case CURLE_UNSUPPORTED_PROTOCOL:
    return "Unsupported protocol";
.....
}

我知道,如果您想返回指针,则需要确保将指针点不会更改或释放的内存。为什么此libcurl代码有效?

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

参考

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

在翻译阶段7中,将一个字节或值零代码附加到每个多键由字符串文字或文字产生的字符序列。多重字符然后使用序列来初始化静态存储持续时间和长度的阵列足以包含序列。

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

如果程序试图修改这种数组,则行为是未定义。

这告诉我们数据必须仅读取。

编辑

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

某些平台可能不支持仅阅读数据,但是编译器几乎可以肯定会试图阻止您修改它。由于行为是不确定的,因此目的是您永远不会这样做,因此,出于所有目的和目的,数据都是仅读取的。

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

根据C标准(6.4.5 字符串文字,第6段(,字符串文字具有静态存储持续时间:

一个字节或值零代码附加到由字符串文字或文字产生的每个多键字符序列。然后,多级字符序列用于初始化静态存储持续时间的数组[…]

这意味着他们的内存,无论物理上可能在任何地方,都可以保证超过函数返回,并且对此内存的指针仍然有效。

因此,您正在将指针返回到保证有效的内存位置,其中包含字符串文字给出的值。

相关内容

  • 没有找到相关文章

最新更新