我总是尽量避免返回字符串文字,因为我担心它们不是在函数之外定义的.但我不确定是不是这样.我们来看一下这个函数:
const char * return_a_string(void) { return "blah"; }
这是正确的代码吗?它确实适用于我,但也许它只适用于我的编译器(gcc).所以问题是,do(string)文字有一个范围,或者它们是否一直存在/定义.
这段代码适用于所有平台.字符串作为静态字符串文字编译到二进制文件中.例如,如果您在Windows上,您甚至可以使用记事本打开.exe并搜索字符串本身.
既然它是静态字符串,字面量范围无关紧要.
字符串池:
需要注意的一点是,在某些情况下,可以"汇集"相同的字符串文字以节省可执行文件中的空间.在这种情况下,每个相同的字符串文字可以具有相同的内存地址.你永远不应该假设它会或不会是这种情况.
在大多数编译器中,您可以设置是否使用静态字符串池进行搅拌文字.
字符串文字的最大大小:
一些编译器具有字符串文字的最大大小.例如,对于VC++,这大约是2,048字节.
修改字符串文字会产生未定义的行为:
永远不应该修改字符串文字.它有一个未定义的行为.
char * sz = "this is a test"; sz[0] = 'T'; //<--- undefined results
宽字符串文字:
以上所有内容同样适用于宽字符串文字.
示例:L"这是一个宽字符串文字";
C++标准规定:( section lex.string)
1字符串文字是由双引号括起的字符序列(在lex.ccon中定义 ),可选地以字母L开头,如"..."或"L"......".不以L开头的字符串文字是普通的字符串文字,也称为窄字符串文字.普通的字符串文字具有类型"n const char数组"和静态存储持续时间(basic.stc),其中n是下面定义的字符串的大小,并用给定的字符初始化.以L开头的字符串文字,例如L"asdf",是一个宽字符串文字.宽字符串文字具有类型"n const wchar_t的数组"并具有静态存储持续时间,其中n是下面定义的字符串的大小,并使用给定的字符进行初始化.
2是否所有字符串文字都是不同的(即存储在非重叠对象中)是实现定义的.尝试修改字符串文字的效果是未定义的.
我举个例子,让你的困惑变得有些明显
char *f() { char a[]="SUMIT"; return a; }
这不行.
但
char *f() { char *a="SUMIT"; return a; }
这很有效.
原因:"SUMIT"是一个具有全局范围的文字.而数组只是一个字符序列{'S','U','M','I',"T''\ 0'}具有有限的范围,并且一旦返回程序就会消失.
希望这可以帮助
正如其他人所解释的那样,这在C(或C++)中是有效的.
我要注意的一件事是,如果你正在使用dll,那么如果卸载包含这段代码的dll,指针将不会保持有效.
C(或C++)标准不理解或考虑在运行时加载和卸载代码,因此任何执行此操作的内容都将面临实现定义的后果:在这种情况下,结果是字符串文字,应该具有静态存储持续时间,从调用代码的POV出现,不会持续整个程序的整个持续时间.