(字符串的文字范围)>

问题描述 投票:30回答:7

我总是尽量避免返回字符串文字,因为我担心它们不是在函数外部定义的。但是我不确定是否是这种情况。让我们以这个函数为例:


const char *
return_a_string(void)
{
    return "blah";
}

这是正确的代码吗?它确实对我有用,但也许仅对我的编译器(gcc)有效。所以问题是,(字符串)文字是否具有作用域,或者它们始终存在/定义。

我总是尽量避免返回字符串文字,因为我担心它们不是在函数外部定义的。但是我不确定是否是这种情况。让我们以这个函数为例:const char * ...

c string literals
7个回答
43
投票

此代码在所有平台上均适用。该字符串将作为静态字符串文字编译为二进制文件。例如,如果您在Windows上,甚至可以使用记事本打开.exe并搜索字符串本身。


10
投票

我给你举个例子,以便使您的困惑更加清楚


6
投票

[正如其他人所解释的,这在C(或C ++)中有效。


3
投票

是的,很好。它们位于全局字符串表中。


3
投票

否,字符串文字没有作用域,因此可以保证您的代码可在所有平台和编译器上正常工作。它们存储在程序的二进制映像中,因此您始终可以访问它们。但是,尝试向它们写入(通过丢弃const)将导致不确定的行为。


0
投票

您实际上返回了一个指针,该指针指向存储在可执行文件的数据部分中的零终止字符串,这是在加载程序时加载的区域。只是避免尝试更改字符,否则可能会产生不可预测的结果...


0
投票

记录Brian提到的不确定结果非常重要。由于已将函数声明为返回const char *类型,因此应该可以,但是在许多平台上,字符串文字会被放置在可执行文件的只读段(通常是文本段)中,对其进行修改将导致访问冲突在大多数平台上。

© www.soinside.com 2019 - 2024. All rights reserved.