2

C 标准是否为下面的程序提供任何借口不在其标准输出上产生千兆字节的空间?

#include <stdio.h>

int main()
{
  // 2^64 = 18446744073709551616
  printf("x%18446744073709551619dx\n", 42);
  return 0;
}

在 Mac OS X 10.8 和 Linux 上测试,我得到x 42x.

C11 标准说 (7.21.6.1:4):“可选的最小字段宽度。如果转换后的值的字符数少于字段宽度,则在字段宽度的左侧(或右侧,如果已给出稍后描述的左侧调整标志)用空格(默认情况下)填充。字段宽度采用星号 *(稍后描述)或非负十进制整数的形式。”</p>

C99 中的措辞是相同的。

当字段宽度为 时*,相应的参数将作为int(7.12.6.1:5) 获得。但似乎并没有说硬编码的字段宽度应该适合int.

4

2 回答 2

2

虽然它没有解决字段宽度编码限制的具体问题,但请注意 §7.21.6.1/15 声明“任何一次转换可以产生的字符数至少为 4095”。因此,即使实现确实正确解析了 2^64 + 3,它也符合输出 4094 个空格而不是“千兆字节”。

于 2013-07-31T19:01:09.960 回答
1

尽管 C 标准没有定义最大值,但我猜每个编译器都有一个最大值。

这是一个类似的问题: printf 转换规范的大小限制

于 2013-07-29T12:29:16.277 回答