当前位置:  开发笔记 > 开发工具 > 正文

(字符串)文字的范围

如何解决《(字符串)文字的范围》经验,为你挑选了3个好方法。

我总是尽量避免返回字符串文字,因为我担心它们不是在函数之外定义的.但我不确定是不是这样.我们来看一下这个函数:

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

这是正确的代码吗?它确实适用于我,但也许它只适用于我的编译器(gcc).所以问题是,do(string)文字有一个范围,或者它们是否一直存在/定义.



1> Brian R. Bon..:

这段代码适用于所有平台.字符串作为静态字符串文字编译到二进制文件中.例如,如果您在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是否所有字符串文字都是不同的(即存储在非重叠对象中)是实现定义的.尝试修改字符串文字的效果是未定义的.


我的意思是那些C99构造,你可以像(int []){1,2,3,4}一样动态创建一个结构或数组.我知道这不是我最初的问题的一部分,但既然你提到了宽字符串文字,我对其他文字很好奇:).

2> 小智..:

我举个例子,让你的困惑变得有些明显

char *f()
{
char a[]="SUMIT";
return a;
}

这不行.

char *f()
{
char *a="SUMIT";
return a;
}

这很有效.

原因:"SUMIT"是一个具有全局范围的文字.而数组只是一个字符序列{'S','U','M','I',"T''\ 0'}具有有限的范围,并且一旦返回程序就会消失.

希望这可以帮助



3> Steve Jessop..:

正如其他人所解释的那样,这在C(或C++)中是有效的.

我要注意的一件事是,如果你正在使用dll,那么如果卸载包含这段代码的dll,指针将不会保持有效.

C(或C++)标准不理解或考虑在运行时加载和卸载代码,因此任何执行此操作的内容都将面临实现定义的后果:在这种情况下,结果是字符串文字,应该具有静态存储持续时间,从调用代码的POV出现,不会持续整个程序的整个持续时间.

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有