C语言结构体内存对齐以及动态内存的申请 📅 2026/8/17 20:01:58 引用下面的结构体在进行动态内存申请时为多大struct Noet { int a; char b; int c; short e; } 我们知道整形字节浮点型字节char1float4unsigned char1double8short2long double8unsigned short2int4unsigned int4long(long long)8假设动态申请将在这一块小区间里面申请。规则一每个成员的偏移是该成员自身大小的整数倍。我们先看int a和char b首先int 在前所以我们先放入int :其次是char因为char占一个字节所以char与任意整数都是整数倍所以直接挨着申请即可则有在往后看char后面是int 我们看在动态内存中char下一个是5显然不满足int的整数倍所以内存就会损失3个字节让内存来到整数8的位置之后再填入4个字节即可如下最后一个short直接根据规则填入整数倍即可。规则二结构体的整体大小是最大基础成员大小的整数倍。我们再上面成功的推断出结构体的各个成员再内存中的位置和大小可是结构体整体的大笑是多少呢显然不能直接得出这时候我们就要用到规则二了。因为再这个结构体中占最大字节的成员是int所以结构体整体大小应为4的倍数及x % 4 0了显然肉眼可得是16才可以。所以这道题最终申请到的动态内存大小为16字节。规则三嵌套的子结构体的首对齐数为该子结构体最大基础成员对其位置的整数倍。0是所有整数的整数倍‘0 a * 0’我们加强一下结构体嵌套结构体的内存申请。 struct Noet { char a; int b; short c; } struct NL { char d; struct Noet p; short e; 以上对结构体NL进行动态内存申请的大小为多少struct Noet:我们易得Noet结构体申请的内存为12字节struct NL因为char为一字节偏移0而在子结构体Noet中最大的类型为 int所以这里又可以运用规则三所以char a排在空间位置4这个地方。short为2字节偏移16short直接对应16位置写入即可因为由规则二可知结构体的整体大小由最大的基础成员的整数倍决定。由数数可知现在的内存大小为18并不是4的倍数反之现在离18大且为4的倍数的值为20。所以该结构体整体大小为20字节对应图中位置为19。