20

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


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

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

char 数组没有限制;也许

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

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

我的理解是字符串文字相当于包含字符的 char 数组,即:总是可以重写如下内容:

const char* str = "foo";

进入这个

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

那么为什么对文字有如此严格的限制呢?

4

3 回答 3

23

字符串文字的限制是编译时要求;逻辑源代码行的长度也有类似的限制。编译器可能使用固定大小的数据结构来保存源代码行和字符串文字。

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

另一方面,char可以在运行时构建对象(例如 的数组)。这些限制可能是由目标机器架构强加的,而不是编译器的设计。

请注意,这些不是强加于程序的上限。编译器根本不需要施加任何有限的限制。如果编译器确实对行长度施加了限制,则它必须至少为 509 或 4095 个字符。(我认为,大多数实际编译器不会施加固定限制;而是动态分配内存。)

于 2012-07-15T01:26:47.797 回答
6

不是说 509 个字符是字符串的限制,而是 ANSI 兼容性所需的最低要求,如此所述。

我认为标准的制定者将数字 509 从他们的屁股中拉了出来,但除非我们从中获得一些官方文件,否则我们无法知道。

至于字符串文字中实际可以包含多少个字符,这取决于编译器。

这里有些例子:

  • MSVC: 2048
  • GCC:无限制(最多 100,000 个字符),但在 510 个字符后发出警告:

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

于 2012-07-15T01:25:55.880 回答
2

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

于 2013-01-18T09:47:07.553 回答