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

张开发
2026/4/16 23:03:16 15 分钟阅读

分享文章

关于sizeof求struct和union长度的问题
最近复习sizeof的相关用法发现自己之前理解错误这里巩固一下。Visual stdio环境下默认字节对齐数为8技巧找出结构中所占内存最大的类型以该类型所占字节数为参照若前面的变量之和小于该类型所占字节数则将其补齐到参照类型的字节长度一、struct类型的sizeof计算1、空结构体/*空结构体*/ struct test { }; //结果sizeof(test) 12、一般结构体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; //cd长度5补3个字节--8 }; /*说明 *步骤1因为此结构体中占用内存最长的是double类型的变量b所以以变量b为基准8个字节 *步骤2基准前面的变量a只占1个字节所以需要补7个字节对齐后a变量就占用原本字节1 对齐的字节7 8个字节 *步骤3基准后面的c和d分别占4个字节和1个字节由于cd所占总字节数为5小于基准8所以需要补3个字节即对齐后的c和d总占用原本字节5 对齐的字节3 8个字节 *步骤4故该结构体所占内存大小为8变量a 8变量b 8变量cd 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*816所以需要补6个字节即对齐后的c和d总占用原本字节10 对齐的字节6 16个字节 *步骤4故该结构体所占内存大小为8变量a 8变量b 16数组c 32 */5、内嵌结构体情况一/*内嵌结构体情况一*/ struct test1 { char a; //1 int b; //4 //长度145补3个字节--8 double c; //8基准 bool d; //长度1补7个字节--8 }; /*说明 *步骤1因为此结构体中占用内存最长的是double类型的变量c所以以变量c为基准8个字节 *步骤2基准前面的变量a和b共占145个字节所以需要补3个字节对齐后a、b变量共占用原本字节5 对齐的字节3 8个字节 *步骤3基准后面的d占了1个字节需要补齐为基准的整数倍即1*88所以需要补7个字节即对齐后的d占用原本字节1 对齐的字节7 8个字节 *步骤4故该结构体所占内存大小为8变量ab 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*88所以需要补4个字节即对齐后的d占用原本字节4 对齐的字节4 8个字节 *步骤4故该结构体所占内存大小为8变量a 24变量b 8变量d 40 */ //结果sizeof(test2) 32 8 406、内嵌结构体情况二//内嵌结构体情况二 struct test4 { char a; //1 int b; //4 }; //sizeof(test4) 8 struct test5 { char c; //1 test4 d; //8 //长度17816 double e; //8由于结构体d中成员变量最大为4字节所以以变量e为基准 bool f; //长度178 }; //结果sizeof(test5) 24 8 32二、union类型的sizeof计算1、一般联合体类型/*一般联合体类型*/ union un { int a; //长度4 double b; //长度8 char c; //长度1 int d; //长度4 }; 结果其中占用内存最长的sizeof(un) 82、包含数组的联合体1/*数组型1*/ union test { int a; //4 double b; //8 char c[10]; //1 * 10 10 }; //联合体最大数据类型为c[10]长度为10进行内存对齐后联合体长度应为2*8163、包含数组的联合体2/*数组型2*/ union un { int a[7]; //长度 - 4 * 728 double b; //长度 - 8 char c[10]; //长度 - 1 * 10 int d[3]; //长度 - 3 * 412 }; //可知最长的为a[7]长度为28但需要内存对齐所以结果sizeof(un) 324、嵌套型/*嵌套型*/ union number { int i; //长度4 struct { char first; //长度1 char second; //长度1 }half; }num; //其中half结构体长度为112 - 8但最长的类型是char小于结构体number中的int,所以结果sizeof(num) 4OK目前就这些有补充的话欢迎各位踊跃发言

更多文章