Chinaunix首页 | 论坛 | 博客
  • 博客访问: 384679
  • 博文数量: 62
  • 博客积分: 388
  • 博客等级: 一等列兵
  • 技术积分: 1032
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-03 20:18
文章分类

全部博文(62)

文章存档

2017年(5)

2016年(3)

2015年(3)

2014年(8)

2013年(15)

2012年(28)

分类: C/C++

2013-08-19 23:13:25

    栈是系统的一块连续的内存空间,后进先出原则(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是高地址。

示例程序

就上述原理,写一个程序来验证说明

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main(void)
  3. {

  4.         int m;
  5.         int n;
  6.         struct test_s
  7.         {
  8.                 char a;
  9.                 char b:4,
  10.                      c:4;
  11.                 char d;
  12.                 char e;
  13.         } test;

  14.         printf("addr m = %p\n", &m);
  15.         printf("addr n = %p\n", &n);
  16.         printf("addr test = %p\n\n", &test);

  17.         printf("addr a = %p\n", &test.a);
  18.         printf("addr d = %p\n", &test.d);
  19.         printf("addr e = %p\n\n", &test.e);

  20.         unsigned i = 0x12345678;
  21.         test = *((struct test_s *)&i);

  22.         printf("a = %x\n", test.a);
  23.         printf("b = %x\n", test.b);
  24.         printf("c = %x\n", test.c);
  25.         printf("d = %x\n", test.d);
  26.         printf("e = %x\n", test.e);

  27. }
执行结果


程序中 入栈顺序依次是m、n、test,且地址是递减的,说明栈的方向是向低地址生长的。
再申请test的空间时 栈顶地址是n = 0xbfbaef78 test 的长度为4个字节 所以test的地址为 : &test = &n - 4; 和结构体第一个元素的地址相同。
该系统是小端存储,test a是低地址 所以存储低位0x78, e 是高地址 存储0x12.


阅读(1297) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~