假设在一个32位little endian的机器上运行下面的程序,结果是多少?
假设在一个 32 位 little endian 的机器上运行下面的程序,结果是多少?
#include <stdio.h>
int main()
{
long long a = 1, b = 2, c = 3;
printf("%d %d %d\n", a, b, c);
return 0;
}
注意:
-
C,C++中函数的参数是从右往左入栈的,printf属于库函数,调用它的时候遵循这个原则;
-
栈的生长方向是从高地址往低地址的;
-
小端模式是低位存储在低地址;
-
%d格式输出的是4个字节大小,而long long不管是32或64位系统都为8个字节。
首先定义三个局部变量a,b,c
,在main函数的栈帧中,同类型的变量,谁先定义谁先入栈,a先定义,a先入栈,其次b,再次c。 我们调用内存监视窗口可以看到a,b,c变量的地址,其中a的地址最大,b次之,c最小,因为栈是从高地址写向低地址的,由此可以判断定义变量时的入栈顺序是a,b,c。
运行到printf函数时,参数入栈是从右到左,也就是c先入栈,其次b,再次a。出栈顺序与入栈相反,%d打印每次出栈4个字节,就导致错位。输出1 0 2