4

这是一个快速的问题。

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

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

输出看起来像:

2621244 4352722 1426724

我想知道为什么会发生这种情况,以及这些数字是什么意思。如果你有一个想法,那真的很有帮助。谢谢。

4

2 回答 2

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 会做你所期望的:为每个格式说明符获取适当的堆栈位置并适当地格式化它。当您不传递其他参数时,这些堆栈位置中的任何内容都会被输出,因此是“随机”值。

于 2012-11-04T01:53:52.017 回答
1

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

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

于 2012-11-04T01:55:55.073 回答