首先,我们来看一个问题,假设在一个32为小端机器上运行下面程序,结果是什么?
#include <stdio.h>
int main(){
long long a = 1, b = 2, c = 3;
printf("%d %d %d\n", a, b, c);
return 0;
}
下面我们直接运行一下,来看一下结果:
我们可以看到运行结果是1、0、2,这是为什么呢?
这是因为printf函数不是将参数分开压栈,而是一股脑全部压栈,而printf压栈的顺序是从右向左的,所以堆栈中的数据应该是:1000、0000、2000、0000、3000、0000。而**%d是按四个字节输出**,所以第一个%d输出1,第二个%d输出0,第三个%d输出2。
- 我们调试一下程序,查看反汇编:
可以看到参数压栈顺序确实是从右向左。 - 下面,我们来画一下大概的入栈出栈示意图。
如果我们不把a、b、c放在一个printf函数中就不会有这个问题,分开打印,结果就是1,2,3。
#include <stdio.h>
int main(){
long long a = 1, b = 2, c = 3;
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", c);
return 0;
}
运行结果如下: