澄清 :鉴于文字的字符串可以被重写为const char[]
见下文),强加文字较低的最高长度大于上char[]
s是只是一个句法不便。 为什么C标准鼓励呢?
在C89标准对字符串字面翻译限制:
在一个字符串的字符509或字面宽字符串文字(串联后)
没有一个字符数组的限制; 也许
32767个字节中的对象(在托管环境中只)
适用(我不知道是什么意思的对象或托管环境中),但无论如何这是一个更高的极限。
我的理解是,一个字符串文字相当于包含字符的字符数组,即:它总是能够改写这样的事情:
const char* str = "foo";
这个
static const char __THE_LITERAL[] = { 'f', 'o', 'o', '\0' };
const char* str = __THE_LITERAL;
那么,为什么在这样的文字的硬性限制?
对字符串文字的限制是一个编译时间要求; 有在逻辑源极线的长度的类似限制。 编译器可以使用一个固定大小的数据结构,以保持源极线和字符串。
(C99增加了从509到4095个字符这些特定的限制。)
在另一方面,一个对象(如阵列char
)可以在运行时建立。 此限制由目标机器结构可能强加的,而不是由编译器的设计。
请注意,这些都不是强加在程序上界。 编译器是完全不需要施加任何限制有限。 如果编译器强加线长度的限制,它必须是至少509或4095个字符。 (最实际的编译器,我认为,不征收固定的限制,相反,它们动态分配内存。)
这并不是说509个字符是一个字符串的限制,它是ANSI兼容所需的最低限度,为解释在这里 。
我认为,该标准的制定者拉到数509出他们的屁股,但除非我们从中得到一些官方文件,有没有办法让我们知道。
至于实际有多少个字符可以是一个字符串,也就是编译器相关。
这里有些例子:
- MSVC:2048
- GCC:无限制(可达10万个字),但给后510个字符的警告:
字符串文字长度100000的超过C90的编译器需要支持的最大长度509
很抱歉的回答晚了,但我想说明这两种情况之间的差异(理查德·罗斯已经指出,他们是不等价的。)
假设你试试这个:
const char __THE_LITERAL[] = { 'f', 'o', 'o', '\0' };
const char* str = __THE_LITERAL;
char *str_writable = (char *) str; // Not so const anymore
str_writable[0] = 'g';
现在, str
包含“咕”。
但是,如果你这样做:
const char* str = "foo";
char *str_writable = (char *) str;
str_writable[0] = 'g';
结果:段错误! (在我的平台上,至少。)
这是根本区别:在第一种情况下,你有被初始化为“foo”的一个阵列,但在第二种情况下,你有一个实际的字符串文字。
在一个侧面说明,
const char __THE_LITERAL[] = { 'f', 'o', 'o', '\0' };
完全等效于
const char __THE_LITERAL[] = "foo";
在这里, =
充当数组初始化而不是分配。 这是很大的不同
const char *str = "foo";
其中字符串字面的地址分配给str
。