众所周知,在C++中,字符串文字是不可变的,并且修改字符串文字的结果是不确定的。例如
char * str = "Hello!";
str[1] = 'a';
这将带来不确定的行为。
除此之外,字符串文字被放置在静态内存中。因此它们存在于整个程序中。我想知道为什么字符串文字具有这样的属性。
最佳答案
有两个不同的原因。
一种是允许将字符串文字存储在只读存储器中(正如其他人已经提到的那样)。
另一个是允许合并字符串文字。如果一个程序在几个不同的地方使用相同的字符串文字,那么允许(但不一定要求)编译器合并它们是很好的选择,因此您可以获得指向同一内存的多个指针,而不是每个指针都占用单独的内存块。当两个字符串文字不一定相同但结尾相同时,这也适用:
char *foo = "long string";
char *bar = "string";
在这种情况下,
bar
可能是foo+5
(如果我没有正确计算的话)。在这两种情况下,如果允许修改字符串文字,则可以修改碰巧具有相同内容的其他字符串文字。同时,说实话,强制执行也没有太多意义-拥有足够的字符串文字以致您可能会重叠是很不常见的,大多数人可能希望编译器运行得慢一些,以节省(也许)几十个字节左右的内存
在编写第一个标准时,已经有编译器使用了所有这三种技术(可能还有其他几种)。由于无法描述从修改字符串文字中得到的一种行为,而且显然没有人认为这是一种重要的支持功能,因此他们做到了显而易见:说即使尝试这样做也导致未定义的行为。
关于c++ - 为什么字符串文字是const?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14570993/