繁体   English   中英

为什么C字符串文字的最大长度与max char []不同?

[英]Why is max length of C string literal different from max char[]?

澄清 :鉴于字符串文字可以重写为const char[] (见下文),在文字上施加比char[]更低的最大长度只是语法上的不便。 为什么C标准鼓励这个?


C89标准对字符串文字有翻译限制:

字符串文字或宽字符串文字中的509个字符(连接后)

char数组没有限制; 也许

对象中的32767个字节(仅限托管环境中)

适用(我不确定什么对象或托管环境意味着什么),但无论如何它是一个更高的限制。

我的理解是字符串文字等同于包含字符的char数组,即:它总是可以重写这样的东西:

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:无限制(最多100,000个字符),但在510个字符后发出警告:

    长度为100000的字符串文字超过了C90编译器需要支持的最大长度509

对于迟到的答案感到抱歉,但我想说明这两种情况之间的区别(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';

结果:段错! (至少在我的平台上。)

这是根本区别:在第一种情况下,您有一个初始化为“foo”的数组,但在第二种情况下,您有一个实际的字符串文字。

在旁注,

const char __THE_LITERAL[] = { 'f', 'o', 'o', '\0' };

完全等同于

const char __THE_LITERAL[] = "foo";

这里=充当数组初始化器而不是赋值。 这是非常不同的

const char *str = "foo";

其中字符串文字的地址分配给str

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM