Printf没有参数解释

sbn*_*ion 5 c printf

据我所知,如果printf没有参数,它会输出一个意外的值.

例:

#include <stdio.h>

int main() {
    int test = 4 * 4

    printf("The answer is: %d\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这将返回一个随机数.在使用不同格式(如%p,%x等)后,它不会打印16(因为我没有将变量添加到参数部分)我想知道的是,这些值在哪里被采用从?它是堆栈的顶部吗?每次编译时都不是新值,这很奇怪,就像一个固定的值.

oua*_*uah 5

printf("The answer is: %d\n");
Run Code Online (Sandbox Code Playgroud)

调用未定义的行为.C要求转换说明符具有关联的参数.虽然它是未定义的行为并且任何事情都可能发生,但在大多数系统上,您最终都会转储堆栈.这是格式字符串攻击中使用的一种技巧.


Bas*_*tch 5

这被称为未定义行为,它很可怕(请参阅此答案)。

如果您想要解释,您需要深入研究具体的实现细节。因此,请研究生成的源代码(例如,使用gcc -Wall -Wextra -fverbose-asm您的优化标志进行编译,然后查看生成的.s汇编文件)和系统的ABI 。