news 2026/5/27 9:54:08

关于sizeof求struct和union长度的问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
关于sizeof求struct和union长度的问题

最近复习sizeof的相关用法,发现自己之前理解错误,这里巩固一下。

Visual stdio环境下,默认字节对齐数为8;

技巧:找出结构中所占内存最大的类型,以该类型所占字节数为参照,若前面的变量之和小于该类型所占字节数,则将其补齐到参照类型的字节长度;

一、struct类型的sizeof计算

1、空结构体

/*空结构体*/ struct test { }; //结果:sizeof(test) = 1

2、一般结构体1

/*一般结构体1*/ struct test { int a; //长度:4,补4个字节-->8 double b; //长度:8(基准) char c; //长度:1,补7个字节-->8 }; /*说明: *步骤1:因为此结构体中占用内存最长的是double类型的变量b,所以以变量b为基准,8个字节; *步骤2:基准前面的变量a只占4个字节,所以需要补4个字节,对齐后a变量就占用:原本字节(4) + 对齐的字节(4) = 8个字节; *步骤3:基准后面的c只占1个字节,需要补7个字节,故变量c所占字节数为:原本字节:1 + 对齐的字节:7 = 8;综合结构体大小为:8 + 8 + 8 = 24 *步骤4:结果:sizeof(test) = 16 + 8 = 24 */

3、一般结构体2

/*一般结构体2*/ struct test { char a;//长度:1,补7个字节-->8 double b;//8(基准) int c; bool d; //c+d长度:5,补3个字节-->8 }; /*说明: *步骤1:因为此结构体中占用内存最长的是double类型的变量b,所以以变量b为基准,8个字节; *步骤2:基准前面的变量a只占1个字节,所以需要补7个字节,对齐后a变量就占用:原本字节(1) + 对齐的字节(7) = 8个字节; *步骤3:基准后面的c和d分别占4个字节和1个字节,由于c+d所占总字节数为5,小于基准8,所以需要补3个字节,即对齐后的c和d总占用:原本字节(5) + 对齐的字节(3) = 8个字节; *步骤4:故该结构体所占内存大小为:8(变量a) + 8(变量b) + 8(变量c+d) = 24 */

4、包含数组的结构体

struct test { int a; //长度:4,补4个字节-->8 double b; //8 char c[10]; //长度:10,补6个字节-->16 }; /*说明: *步骤1:因为此结构体中占用内存最长的是double类型的变量b,所以以变量b为基准,8个字节; *步骤2:基准前面的变量a只占4个字节,所以需要补4个字节,对齐后a变量就占用:原本字节(4) + 对齐的字节(4) = 8个字节; *步骤3:基准后面的c占了10个字节,需要补齐为基准的整数倍(即2*8=16),所以需要补6个字节,即对齐后的c和d总占用:原本字节(10) + 对齐的字节(6) = 16个字节; *步骤4:故该结构体所占内存大小为:8(变量a) + 8(变量b) + 16(数组c) = 32 */

5、内嵌结构体情况一

/*内嵌结构体情况一*/ struct test1 { char a; //1 int b; //4 //长度:1+4=5,补3个字节-->8 double c; //8(基准) bool d; //长度:1,补7个字节-->8 }; /*说明: *步骤1:因为此结构体中占用内存最长的是double类型的变量c,所以以变量c为基准,8个字节; *步骤2:基准前面的变量a和b共占1+4=5个字节,所以需要补3个字节,对齐后a、b变量共占用:原本字节(5) + 对齐的字节(3) = 8个字节; *步骤3:基准后面的d占了1个字节,需要补齐为基准的整数倍(即1*8=8),所以需要补7个字节,即对齐后的d占用:原本字节(1) + 对齐的字节(7) = 8个字节; *步骤4:故该结构体所占内存大小为:8(变量a+b) + 8(变量c) + 8(变量d) = 24 */ struct test2 { char a; //长度:1,补7个字节-->8 test1 b; //24(基准) int c; //长度:4,补4个字节-->8 }; /*说明: *步骤1:因为此结构体中占用内存最长的是变量b,所以以变量b为基准,24个字节; *步骤2:基准前面的变量a占1个字节,所以需要补7个字节,对齐后a变量共占用:原本字节(1) + 对齐的字节(7) = 8个字节; *步骤3:基准后面的c占了4个字节,需要补齐为基准的整数倍(即1*8=8),所以需要补4个字节,即对齐后的d占用:原本字节(4) + 对齐的字节(4) = 8个字节; *步骤4:故该结构体所占内存大小为:8(变量a) + 24(变量b) + 8(变量d) = 40 */ //结果:sizeof(test2) = 32 + 8 = 40

6、内嵌结构体情况二

//内嵌结构体情况二 struct test4 { char a; //1 int b; //4 }; //sizeof(test4) = 8 struct test5 { char c; //1 test4 d; //8 //长度:(1+7)+8=16 double e; //8(由于结构体d中成员变量最大为4字节,所以以变量e为基准) bool f; //长度:1+7=8 }; //结果:sizeof(test5) = 24 + 8 = 32

二、union类型的sizeof计算

1、一般联合体类型

/*一般联合体类型*/ union un { int a; //长度4 double b; //长度8 char c; //长度1 int d; //长度4 }; 结果:其中占用内存最长的:sizeof(un) = 8

2、包含数组的联合体1

/*数组型1*/ union test { int a; //4 double b; //8 char c[10]; //1 * 10 = 10 }; //联合体最大数据类型为c[10],长度为10,进行内存对齐后,联合体长度应为2*8=16

3、包含数组的联合体2

/*数组型2*/ union un { int a[7]; //长度 -> 4 * 7=28 double b; //长度 -> 8 char c[10]; //长度 -> 1 * 10 int d[3]; //长度 -> 3 * 4=12 }; //可知最长的为a[7],长度为28,但需要内存对齐,所以结果:sizeof(un) = 32

4、嵌套型

/*嵌套型*/ union number { int i; //长度:4 struct { char first; //长度:1 char second; //长度:1 }half; }num; //其中half结构体长度为1+1=2 -> 8,但最长的类型是char,小于结构体number中的int,所以结果:sizeof(num) = 4

OK,目前就这些,有补充的话欢迎各位踊跃发言

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 1:51:37

ubuntu网络管理和双网卡绑定bond以及删除bond完全体-配置netplan

目录 Netplan NetworkManager 环境和需求 方法和步骤 删除Bond0 总结 Netplan 从Ubuntu18.04开始(甚至更早,有说是16.04开始),Ubuntu已经切换到基于YAML的Netplan来配置网络。 Netplan工作流程:通过读取 /etc…

作者头像 李华
网站建设 2026/5/23 1:51:38

OpenClaw学习路径:从Qwen3-4B-Thinking入门到技能开发

OpenClaw学习路径:从Qwen3-4B-Thinking入门到技能开发 1. 为什么选择OpenClaw作为个人自动化工具 第一次听说OpenClaw是在一个开发者社群的深夜讨论中。当时我正在为重复性的文件整理工作头疼——每天要花半小时手动归类下载的研究论文,还要定期清理临…

作者头像 李华
网站建设 2026/5/23 1:51:39

解锁多模式RAG:如何从文档中高效提取文本、表格与图形?

本文深入解析了如何利用CLIP嵌入、多模式提示和工具调用等关键技术,从复杂文档中高效提取文本、表格和图形。重点介绍了CLIP模型如何通过对比学习,在共享的表示空间中比较和推理文本与图像,以及孪生网络在人脸解锁等应用中的具体实现。文章旨…

作者头像 李华
网站建设 2026/5/23 1:51:39

vite-plugin-federation实战:构建React+Vue混合应用完整教程

vite-plugin-federation实战:构建ReactVue混合应用完整教程 【免费下载链接】vite-plugin-federation Module Federation for vite & rollup 项目地址: https://gitcode.com/gh_mirrors/vi/vite-plugin-federation 想要在Vite项目中实现模块联邦&#xf…

作者头像 李华
网站建设 2026/5/24 22:00:39

学生管理系统模板一键获取,毕业设计项目放这了,直接拿走!

项目概览这是一个开源的“通用管理后台系统模板”(),旨在快速构建类似学生管理系统的 Web 应用。它功能完整、代码结构清晰,开发者可直接克隆使用,或在其基础上进行定制开发。核心特性与技术栈特性分类具体内容说明前端…

作者头像 李华