栈
栈是系统的一块连续的内存空间,后进先出原则(last in fist out, LIFO),栈是向低址生长的数据结构,即栈低地址最大,入栈时,栈顶地址减小。
栈空间的申请
申请栈空间,即入栈。栈顶地址 = 当前栈顶地址 - 申请的空间字节数, 申请成功后 返回栈顶地址。
例如:short i; 定义一个short 内型的局部变量 即申请2个字节的栈空间。若当前栈顶为0x000008 则 i 的地址 &i = 0x000008 - 2 = 0x000006
|___|
|___| <--新栈顶 0x000006 i 的地址
|___|
|___| <--当前栈顶 0xbf000008
|___|
|___| <-- 栈底 0xbf00000a
字节序
字节序,即存储字节(数据)的顺序,分大端存储和小端存储。采取哪种存储方式有CPU决定的。一般采取小端存储方式,网络数据包采用大端存储(网络字节序)。
小端存储:低地址存储数据的低位
大端存储:低地址存储数据的高位
一般情况下按单个字节来存储,若有位域要求,要一个位域来存储。如图
short a = 0x1234 &a = 0xbf000008
struct test
{
char a:4,
b:4;
} m; char n =0x12; m = *((struct test *)&n); a是低地址, b是高地址。
示例程序
就上述原理,写一个程序来验证说明
-
#include <stdio.h>
-
-
int main(void)
-
{
-
-
int m;
-
int n;
-
struct test_s
-
{
-
char a;
-
char b:4,
-
c:4;
-
char d;
-
char e;
-
} test;
-
-
printf("addr m = %p\n", &m);
-
printf("addr n = %p\n", &n);
-
printf("addr test = %p\n\n", &test);
-
-
printf("addr a = %p\n", &test.a);
-
printf("addr d = %p\n", &test.d);
-
printf("addr e = %p\n\n", &test.e);
-
-
unsigned i = 0x12345678;
-
test = *((struct test_s *)&i);
-
-
printf("a = %x\n", test.a);
-
printf("b = %x\n", test.b);
-
printf("c = %x\n", test.c);
-
printf("d = %x\n", test.d);
-
printf("e = %x\n", test.e);
-
-
}
执行结果
程序中 入栈顺序依次是m、n、test,且地址是递减的,说明栈的方向是向低地址生长的。
再申请test的空间时 栈顶地址是n = 0xbfbaef78 test 的长度为4个字节 所以test的地址为 : &test = &n - 4; 和结构体第一个元素的地址相同。
该系统是小端存储,test a是低地址 所以存储低位0x78, e 是高地址 存储0x12.
阅读(1330) | 评论(0) | 转发(0) |