这是一个简单的问题。
当你在要打印的字符串中使用格式说明符时,但是没有列出要在字符串后面替换占位符的任何值,你会得到看似随机的数字,例如2627389,6278253等作为输出。这是一个例子:
printf("%d %d %d");
输出看起来像:
2621244 4352722 1426724
我想知道为什么会发生这种情况,这些数字意味着什么。如果你有一个想法,它会真的有帮助。 感谢。
答案 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)
它被称为“未定义的行为”;)
充其量,你会得到垃圾。在最坏的情况下,你实际上可能会使程序崩溃。