关于结构体对齐与补齐原则问题详解

序言:来上专业课了,是网课,没有互动功能,干听,很讨厌,有一些细节问题,没讲清楚,真服了,不吐槽了,直接上问题吧。

问题描述

在学到结构体时有一个对齐与补齐原则:网课给的概念是
在这里插入图片描述
接下来我们进行验证:

struct S1{
    char i; //一个字节
    short z;//两个字节
    int y;  //四个字节
    double x;//8个字节
}s2;

根据原则:

char i :在内存中 i 1个字节 则不是4的整数倍,后面应该补 3个空,但是别着急后面跟的时short z;(2个字节)
本质上应该是 char i 空 z(2个字节)//此时总共4个字节补了一个
后边是 int y:本身4个字节,是4的整数倍 则应该整好放到内存块
接下来是double类型:本身8个字节,按照给的概念超过4字节的按8字节来算,出现问题了,应该是也是4字节,这样一算长度是12:但是运行结果是16.
在这里插入图片描述
所以正确的因该是把最后一句概念去掉,应该是以最大的长度为一个内存分配块,而不是超过4字节的按4字节算。

正确理解:在本组定义中,最大的是double:8字节,内存是以8为内存块的,所以最终长度,肯定是8的倍数,比如:

struct S1{
    char i;    //内存  1字节 0*** **** (注:*代表空,0代表有数据)
    short z;   //内存  2字节 0*00 ****
    int y;     //内存  4字节 0*00 0000
    double x;  //内存  8字节 0*00 0000
               //           0000 0000
    int a;     //内存  4字节 0*00 0000
               //           0000 0000
               //           0000 ****       共24字节
}s2;

在这里插入图片描述
只要是所有元素中,最大字节小于4字节,则内存(linux,clion,编译器)默认4字节为一个内存块,如果元素中最大类型超过4,则最终结果一定是该数长度的整倍数。
如有问题请留言!感谢。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值