澄清:鉴于字符串文字可以重写为const
char[]
(见下文),对文字强加的最大长度低于
char[]
只是一种语法上的不便。为什么是C标准
鼓励这个?
C89标准对字符串文字有一个翻译限制:
字符串文字或宽字符串文字中的509个字符(连接后)
char数组没有限制;也许
对象中的32767字节(仅限托管环境中)
适用(我不确定什么对象或托管环境意味着什么),但无论如何它都是一个更高的限制。
我的理解是字符串文字等同于包含字符的字符数组,即:它总是可以重写这样的东西:
const char* str = "foo";
进入这个
static const char __THE_LITERAL[] = { 'f', 'o', 'o', '\0' };
const char* str = __THE_LITERAL;
那么为什么对文字有如此严格的限制?
答案 0 :(得分:20)
字符串文字的限制是编译时要求;对逻辑源行的长度有类似的限制。编译器可能使用固定大小的数据结构来保存源行和字符串文字。
(C99将这些特定限制从509个字符增加到4095个字符。)
另一方面,可以在运行时构建对象(例如char
的数组)。限制可能是由目标机器架构强加的,而不是由编译器的设计强加的。
请注意,这些不强加于程序的上限。编译器不需要施加任何有限的限制。如果编译器对行长度施加限制,则它必须至少为509或4095个字符。 (我认为,大多数实际编译器都不会施加固定限制;而是动态分配内存。)
答案 1 :(得分:5)
不是509个字符是字符串的限制,它是ANSI兼容性所需的最小值,如here所述。
我认为该标准的制造商将数字509从他们的屁股中拉出来,但除非我们从中得到一些官方文件,否则我们无法知道。
对于字符串文字中实际可以包含多少个字符,这取决于编译器。
以下是一些例子:
长度为100000的字符串文字超过了C90编制者需要支持的最大长度509
答案 2 :(得分:1)
对于迟到的答案感到抱歉,但我想说明这两种情况之间的区别(Richard J. Ross已经指出它们不相同。)
假设你试试这个:
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
包含“goo”。
但如果你这样做:
const char* str = "foo";
char *str_writable = (char *) str;
str_writable[0] = 'g';
结果:segfault! (至少在我的平台上。)
这是根本区别:在第一种情况下,你有一个初始化为“foo”的数组,但在第二种情况下你有一个实际的字符串文字。
旁注,
const char __THE_LITERAL[] = { 'f', 'o', 'o', '\0' };
完全等同于
const char __THE_LITERAL[] = "foo";
这里=
充当数组初始值设定项而不是赋值。这与
const char *str = "foo";
将字符串文字的地址分配给str
。