结构体的内存分配(sizeof)

(1)先是定义了如下结构体:

     struct{
            char a;
            int i;
            double d;
            }text;

   然后用sizeof(text),预期结果是1+2+8 = 11???如果这样想就错了,答案是16.

(2)然后,换一下变量的顺序:

     struct{
            char a;

            double d;
            int i;
           }text;

   猜猜答案是多少?11?16?错,答案是24

(3)再换个顺序:

     struct{

            double d;
            char a;

            int i;
            }text;

   又开始猜答案了,11?16?24?这次终于蒙对了,答案是16

   也许有人会问,同一个结构体,就是变量顺序的不同,为什么大小会有如此大的差别?下面就慢慢来解释。

   在存储过程中,为了提高CPU的存储速度,编译器会对变量的起始地址做“对齐”处理。VC规定结构体的各变量存放的起始地址相对于结构体的起始地址的偏移量必须是该变量的类型所占字节数的倍数,并且整个结构体的字节数必须是该结构体中占用空间最大的类型的字节数的整数倍。所以上述3个结构体实际分配情况如下:

(1)1000 1111 11111111(0表示补充位)

     首先,为char类型的a分配,由于是第一个,相当于起始地址是0,是sizeof(char)的整数倍,分配一位;接着,为int类型的i分配,其字节数是4,与起始地址的偏移量是1,不是4的整数倍,于是补充3个填充位,再为i分配4位;最后,为double类型的d分配,其字节数是8,与起始地址的偏移量是8,刚好是整数倍,于是接着分配8位,整个结构体就占16位。

(2)1 0000000 11111111 1111 0000 (由于20不是8的整数倍,最后还会补充4位,共计24位)

(3)11111111 1000 1111(共计16位)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值