此问题在此处已有答案:
Undefined, unspecified and implementation-defined behavior(9个回答)
19天前关闭。
我使用printf查询输出值。
我运行了下面的代码,得到了一个不寻常的结果。
int i = 1, j = 2;
printf(" %x %x %x \n", i, j);
字符串
就连第三个输出,也在多次尝试后不断变化。
最近,在研究安全性的同时,我们正在了解各种函数的漏洞,但很难理解printf值的输出。
为什么这个值会出来?
1条答案
按热度按时间fykwrbwg1#
您的格式字符串告诉
printf
需要三个附加参数(共四个)。它在预期的位置查找这些参数(这是额外的寄存器还是堆栈上的相邻位置取决于实现细节,主要是你的操作系统/编译器使用的调用约定)。你没有 * 提供 * 第四个/最后一个参数,因此,该参数的位置仍然是上次使用该寄存器或内存位置时留下的任何随机内容,正如您所观察到的,它通常是垃圾。按照标准,这是未定义的行为,任何事情都可能发生,但在实践中,从调用约定规定参数 * 应该 * 放置的位置阅读垃圾是正常行为。