在printf()中使用格式说明符而没有相应的值

时间:2012-11-04 01:37:45

标签: c printf format-specifiers

这是一个简单的问题。

当你在要打印的字符串中使用格式说明符时,但是没有列出要在字符串后面替换占位符的任何值,你会得到看似随机的数字,例如2627389,6278253等作为输出。这是一个例子:

printf("%d %d %d");

输出看起来像:

2621244 4352722 1426724

我想知道为什么会发生这种情况,这些数字意味着什么。如果你有一个想法,它会真的有帮助。 感谢。

2 个答案:

答案 0 :(得分:3)

在大多数情况下,这些数字是恰好位于堆栈或寄存器中的“随机”值,具体取决于处理器。在过去,函数的所有参数都在堆栈中传递,以相反的顺序推送。对于printf(),第一个参数和最后一个参数将是格式字符串。在您的示例中,堆栈看起来像:

sp[0] = "%d %d %d"

printf会抓取堆栈的顶部(格式字符串)并解析它,在更高的堆栈位置抓取其他参数,根据格式字符串格式化它们并适当地输出它们。

如果你有一个格式良好的printf电话,例如printf(“%d%d%d”,1,2,3),然后堆栈看起来像

sp[3] = 3
sp[2] = 2
sp[1] = 1
sp[0] = "%d %d %d"

printf可以达到您的预期:为每个格式说明符获取适当的堆栈位置并对其进行适当格式化。如果不传递其他参数,则会输出在这些堆栈位置中发生的任何内容,从而输出“随机”值。

答案 1 :(得分:1)

它被称为“未定义的行为”;)

充其量,你会得到垃圾。在最坏的情况下,你实际上可能会使程序崩溃。