14 printf输出格式及栈空间分配

时间:2021-10-19 02:12:02

假设在一个32位的 little endian的机器上运行下面程序,输出结果:1 0 2

#include<stdio.h>
int main() {
long long a=,b=,c=;
printf("%d %d %d\n",a,b,c);
return ;
}

分析:14 printf输出格式及栈空间分配

1 printf()是一个库函数,C,C++中函数的参数是从右往左入栈的;

2 栈的生长方向是从高往低的

3 小端模式是低位存储在低字节

4 %d格式输出的是4个字节大小,而long long为8个字节

所以,a=1,b=0,c=2

补充:栈是高地址到低地址增长,入栈就反过来了。

分析二: 
printf函数的原型是printf(const char*,...); 
第二个参数是任意个数目的参数,所以printf函数不是分个把参数入栈,而是一股脑全部压入堆栈,因此对于8字节的数据来说,堆栈中的数据是1000 0000 2000 0000 3000 0000,%d按四字节输出,因此,第一个%d输出1,第二个%d输出0,第三个%d输出2。 
如果改成printf("%d  ", a);printf("%d  ", b);printf("%d\n", c);那结果就是1,2,3. 
分析三:

little endian指低位字节排放在内存的低地址端(就是起始地址)

long占8个字节,假设其实地址是0,一个地址存一个字节,按照地位编址1,2会按照如下方式存储

地址 0 1 2 3 4 5 6 7 8 ...

内容 1 0 0 0 0 0 0 0 2 ...

%d只能按照四字节连续输出

那么第一个输出的便是0001=1 第二个输出0000=0 第三个输出0002