为什么是C字符串字面不同最大的char []的最大长度?(Why is max length of

2019-06-26 06:50发布

澄清 :鉴于文字的字符串可以被重写为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;

那么,为什么在这样的文字的硬性限制?

Answer 1:

对字符串文字的限制是一个编译时间要求; 有在逻辑源极线的长度的类似限制。 编译器可以使用一个固定大小的数据结构,以保持源极线和字符串。

(C99增加了从509到4095个字符这些特定的限制。)

在另一方面,一个对象(如阵列char )可以在运行时建立。 此限制由目标机器结构可能强加的,而不是由编译器的设计。

请注意,这些都不是强加在程序上界。 编译器是完全不需要施加任何限制有限。 如果编译器强加线长度的限制,它必须是至少509或4095个字符。 (最实际的编译器,我认为,不征收固定的限制,相反,它们动态分配内存。)



Answer 2:

这并不是说509个字符是一个字符串的限制,它是ANSI兼容所需的最低限度,为解释在这里 。

我认为,该标准的制定者拉到数509出他们的屁股,但除非我们从中得到一些官方文件,有没有办法让我们知道。

至于实际有多少个字符可以是一个字符串,也就是编译器相关。

这里有些例子:

  • MSVC:2048
  • GCC:无限制(可达10万个字),但给后510个字符的警告:

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



Answer 3:

很抱歉的回答晚了,但我想说明这两种情况之间的差异(理查德·罗斯已经指出,他们是不等价的。)

假设你试试这个:

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



文章来源: Why is max length of C string literal different from max char[]?
标签: c standards