gpt4 book ai didi

c - 使用 %d 6 次会产生奇怪的输出..为什么?

转载 作者:行者123 更新时间:2023-11-30 18:30:07 25 4
gpt4 key购买 nike

以下代码在我的机器上的输出很奇怪

#include <stdio.h>

void main() {

int x = 5,y=6,sum=0;
sum=x+y;
printf("%d %d %d %d %d %d", sum = x +y );
getch();

}

最佳答案

这是未定义的行为。

简短的答案是不要这样做,并启用编译器警告以在编译时检测它 -Wformat-Wall

长答案:

函数声明为:

int printf(const char *format, ...);

这意味着它知道第一个参数是一种格式,之后可能还有更多。它扫描 format 字符串,对于每个说明符(例如 %d),它尝试从与该类型相对应的堆栈中删除数据(在本例中为 >int)。

调用函数时,您会执行以下操作:

push sum
push const_format_string_pointer
call printf

在 printf 中,它将首先读取 const_format_string_pointer,然后读取 sum,然后读取 sum 之前堆栈上的任何内容。这通常是调用函数的局部变量(在本例中为xysum)。事实上,它确实打印出了 11 和 6,分别对应于 sumy。另一个 %d 可能会打印出 5。

这三个大数字是编译器根据自己的需要添加到堆栈中的内容。它们在 Debug模式下具有含义,但它是特定于编译器的。另外,如果您使用优化来编译代码(例如 -O2),它可能会删除部分或全部较大的数字,并且您最终会在堆栈中打印比调用者的更深的内容本地函数,例如调用者推送的ebp,或者调用者的返回地址等。

关于c - 使用 %d 6 次会产生奇怪的输出..为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32865568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com