本文主要是介绍『踩坑记录』printf函数参数入栈顺序问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
首先,我们来看一个问题,假设在一个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;
}
运行结果如下:
这篇关于『踩坑记录』printf函数参数入栈顺序问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!