如果我 printf 一个没有匹配参数的整数,具体决定输出的是什么?

O1G*_*O1G -3 c printf

例如,当我的代码如下所示时,对于 a = 0,我得到 -1301113336,对于 a = 1 到 99,得到 -1266657529。

#include <stdio.h>

int main()
{
    int a;
    for (a = 0; a < 100; a++)
    {
        printf("\n%i");
    }
}
Run Code Online (Sandbox Code Playgroud)

当行为因编译器而异时,这是某种未定义的情况吗?如果我使用 gcc,这些数字来自哪里,为什么每次迭代都不会改变?

Bas*_*tch 6

阅读您的实现的调用约定未定义的行为

实际上,打印的内容可能是与您的实现相关的 ABI 规范中提到的某些处理器寄存器的“随机”内容。

Fpr Linux/x86-64 看到这个那个

如果你使用GCC作为你的 C 编译器,你可以编译你的foo.c代码gcc -S -fverbose-asm -Wall -O2 foo.c并查看生成的汇编代码foo.s


dbu*_*ush 5

如果参数数量与格式字符串期望的不匹配,或者如果给定参数不是相应格式说明符的正确类型,则调用未定义行为

在 x64 Linux 机器上使用没有优化的 gcc,你可能会看到:

函数的整数参数通常被压入堆栈。因此,%i格式说明符将sizeof(int)在堆栈上查找字节。如果您未能传入参数,它将读取该参数所在堆栈上碰巧存在的任何字节。