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):“可选的最小字段宽度。如果转换后的值的字符数少于字段宽度,则在字段宽度上用左侧(或右侧,如果左侧调整标志,稍后描述)填充空格(默认情况下)。字段宽度采用星号*(稍后描述)或非负十进制整数的形式。“
C99中的措辞是一样的。
当字段宽度为*
时,相应的参数将作为int
(7.12.6.1:5)获得。但似乎并没有说硬编码的字段宽度应该适合int
。
答案 0 :(得分:2)
虽然它没有解决字段宽度编码限制的具体问题,但请注意§7.21.6.1/ 15指出“任何单次转换可以产生的字符数至少应为4095。”因此,即使实现正确解析2 ^ 64 + 3,它也符合输出4094空格而不是“千兆字节”。
答案 1 :(得分:1)
虽然C标准没有定义最大值,但我猜每个编译器都有一个最大值。