结构体对齐规则

  • 结构体的第一个成员总是存放在结构体变量开辟的空间的起始地址
  • 其它成员变量要存储在一个名叫对齐数的整数倍的地址
  • 结构体总大小为最大对齐数的整数倍,结构体内每一个变量都会产生一个对齐数,取其最大的对齐数
  • 如果是嵌套结构体,那么嵌套的结构体存储在嵌套结构体的成员的最大对齐数的整数倍地址处,包含嵌套结构体的结构体大小为自己成员的对齐数和嵌套结构体的成员的对齐数的最大对齐数的整数倍

结构体Tmp与结构体Cmd,结构体Msg的变量在内存的存放位置

结构体Tmp,大小为12

结构体Cmd,大小为8

结构体Msg,大小为8

示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>struct Tmp
{char c1;int a;char c2;
};struct Cmd
{char c1;char c2;int a;
};struct Msg
{int a;char c1;char c2;
};int main(int argc,char *argv[])
{struct Tmp t;struct Cmd c;struct Msg m;memset(&t,0,sizeof(struct Tmp));memset(&c,0,sizeof(struct Cmd));memset(&m,0,sizeof(struct Msg));printf("int size is %ld\n",sizeof(int)); //4printf("char size is %ld\n",sizeof(char)); //1printf("int* size is %ld\n",sizeof(int *)); //8printf("char* size is %ld\n",sizeof(char *)); //8printf("Tmp struct size is %ld\n",sizeof(struct Tmp)); //12printf("Tmp struct variable size is %ld\n",sizeof(t)); //12printf("Cmd struct size is %ld\n",sizeof(struct Cmd)); //8printf("Cmd struct variable size is %ld\n",sizeof(c)); //8printf("Msg struct size is %ld\n",sizeof(struct Msg)); //8printf("Msg struct variable size is %ld\n",sizeof(m)); //8return 0;
}

嵌套结构体对齐

嵌套结构体Msg1,大小为20

嵌套结构体Msg2,大小为16

#include <stdio.h>
#include <stdlib.h>
#include <string.h>struct Tmp // size = 12
{char c1;int a;char c2;
};struct Cmd // size = 8
{char c1;char c2;int a;
};struct Msg1
{int a;char c1;char c2;struct Tmp t;
};struct Msg2
{int a;char c1;char c2;struct Cmd c;
};int main(int argc, char *argv[])
{struct Tmp t;struct Cmd c;struct Msg1 m1;struct Msg2 m2;memset(&t, 0, sizeof(struct Tmp));memset(&c, 0, sizeof(struct Cmd));memset(&m1, 0, sizeof(struct Msg1));memset(&m2, 0, sizeof(struct Msg2));printf("Msg1 struct size is %ld\n", sizeof(struct Msg1)); // 20printf("Msg1 struct variable size is %ld\n", sizeof(m1)); // 20printf("Msg2 struct size is %ld\n", sizeof(struct Msg2)); // 16printf("Msg2 struct variable size is %ld\n", sizeof(m2)); // 16return 0;
}

C语言结构体对齐,超详细,超易懂相关推荐

  1. C语言结构体对齐的不足

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105065657 C ...

  2. C语言结构体对齐[转]

    C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...

  3. C语言结构体对齐详解

    文章目录 一.C语言结构体对齐大小快速判断 二.反汇编角度看结构体 三.总结 一.C语言结构体对齐大小快速判断 在C语言中定义一个结构体,里面具体占用多少个字节呢,先举一个例子,如下: #includ ...

  4. 结构体对齐计算(超详细讲解,一看就会)

    想要计算结构体大小,咱就先要清楚结构体内存对齐的规则: 1.结构体的第一个成员直接对齐到相对于结构体变量起始位置为0处偏移. 2.从第二个成员开始,要对齐到某个[对齐数]的整数倍的偏移处. 3.结构体 ...

  5. linux windows 结构体,Linux下C语言——结构体对齐

    结构体对齐的步骤: 1.结构体各成员对齐 2.整个结构体圆整 结构体对齐的特定对齐值: 1.自身对齐值: 自身对齐值就是结构体变量里每个成员的自身大小; 2.指定对齐值: 指定对齐值是由宏#pragm ...

  6. Linux+c语言结构体对齐,C语言中结构体struct的对齐问题解析

    一:struct和union的区别 struct,相互关联的元素的集合,每个元素都有自己的内存空间:每个元素在内存中的存放是有先后顺序的,就是定义时候的顺序:一个struct所占的总的内存大小,并不是 ...

  7. 关于我终于拿捏了C语言结构体那点事 ——超详细的C语言结构体讲解

  8. C语言结构体的大小 — — 内存对齐和位域

    C语言结构体对齐 C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结 ...

  9. c语言结构体和联合体,C语言结构体和联合体

    1.单链表插入 #include #include #define FALSE 0 #define TRUE 1 typedef struct NODE{ STRUCT NODE *link; int ...

最新文章

  1. Java中的文件上传2(Commons FileUpload:commons-fileupload.jar)
  2. MS DTC 无法正确处理 DC 升级/降级事件的解决
  3. zabbix添加URL监控
  4. Distributed Systems笔记-Web Service Design Patterns
  5. 使用NDK编译VTK
  6. 加速度和陀螺仪 日常活动识别 跌倒检测_巢湖房屋安全检测,幼儿园房屋质量检测新趋势-房屋鉴定专业团队...
  7. vuex保存用户信息_Vuex状态管理
  8. 两台linux之间互传php脚本,linux下两台服务器实现同步的方法
  9. 算法与数据结构大系列 - NO.1 - 插入排序 1
  10. 求一个数的二进制逆序之后所对应的数
  11. Android11 WAPI证书安装流程
  12. 请求参数为null问题
  13. layui 模板判断_浅谈layui使用模板引擎动态渲染元素要注意的问题
  14. nec编码红外遥控原理整理
  15. 前端获取本地ip和外网ip
  16. STM32F107的SPI3不能使用的问题
  17. 利用百度地图API进行车辆查询并用鼠标拾点获取经纬度
  18. 超详细一文到底!软件测试基本流程
  19. P3964 [TJOI2013]松鼠聚会【切比雪夫距离】
  20. 磁盘、分区及Linux文件系统 [Disk, Partition, Linux File System]

热门文章

  1. 机器学习偏差、方差、泛化误差的完整总结
  2. BiliBili(B站) 三道编程题(2020/09/04)
  3. 电信,请您挺起胸膛赚钱
  4. 求广义表的深度代码解读
  5. 交叉熵的公式是怎么来的
  6. C++标准输出流换向(cout打印到文件)
  7. Jquery 获取图片信息
  8. Lepton 无损压缩原理及性能分析
  9. 空转工具盘点 | 空间转录组细胞类型聚类方法综合比较
  10. K8S 部署 coredns