结构体字节大小计算方法
计算结构体的大小需要的偏移量的知识:
偏移量是指结构体变量中成员的地址和结构体变量的地址的差。第一个成员的偏移量为0,第二个成员的偏移量为第一个成员的偏移量加上第一个成员的大小,依次类推。。。。
(1)无结构体嵌套的情况
结构体的大小为最后一个成员的偏移量+其所占的字节数,除了这个准则外,还需要满足以下的两个原则:
1:结构体中成员的偏移量必须是该成员所在字节数的整数倍。
2:结构体的大小必须是所有成员的整数倍,即最小公倍数。。
(2)有结构体嵌套的情况
需要将嵌套的结构体展开,并且被展开结构体的第一个成员变量的偏移量必须为这个被展开结构体中所占最大字节成员的整数倍。并符合上述1:2:的原则。
举例子说明一下
#include <stdio.h>
struct A
{
char c1;
int i;
charc2;
};
struct B
{
charc1;
charc2;
int i;
};
struct stu5
{
char i;
struct
{
char c;
int j;
} ss;
char a;
char b;
char d;
char e;
char f;
};
struct C
{
inta;
charb;
intd;
structA h;
charc;
};
int main()
{
printf("sizeof A is %d\n",sizeof(struct A));
printf("sizeof B is %d \n",sizeof (struct B));
printf("sizeof stu5 is %d \n",sizeof (struct stu5));
printf("sizeof c is %d \n",sizeof (struct C));
return0;
}
解析如下
struct A
{
charc1;
inti;
charc2;
};
成员 | 所占字节数 | 偏移量 |
Char c1 | 1 | 0 |
Int i | 4 | 本来为1+0,需要满足条件1,故偏移量为4 |
Char c2 | 1 | 4+4为8 |
结构体大小 | 1+8=9不满足2,需要扩展到4的倍数12,所以结构的大小为12 |
struct B
{
charc1;
charc2;
inti;
};
成员
所占字节数
偏移量
Char c1
1
0
Char c2
1
1+0为1
Int i
4
1+1为2,为了满足条件1,扩展到4
结构体大小
4+4=8,所以结构的大小为8
struct stu5
{
char i;
struct
{
char c;
int j;
} ss;
21c80 char a;
char b;
char d;
char e;
char f;
};
成员 | 成员所占字节 | 偏移量 |
Char i | 1 | 0 |
Char c | 1 | 4(嵌套结构体的第一个变量的偏移) |
Int j | 4 | 理论为5,扩展为8 |
Char a | 1 | 12 |
Char b | 1 | 13 |
Char d | 1 | 14 |
Char e | 1 | 15 |
Char f | 1 | 16 |
结构体大小 | 理论为17,必须为4的倍数,故为20 |
struct C
{
inta;
charb;
intd;
structA h;
charc;
};
成员 | 成员所占字节 | 偏移量 |
Int a | 4 | 0 |
Char b | 1 | 4 |
Int d | 4 | 理论为5,扩展为8 |
Char c1 | 1 | 12并满足(int i)4的倍数 |
Int i | 4 | 理论13,扩展为16 |
Char c2 | 1 | 20 |
Char c | 1 | 理论为21,需要为4的倍数,扩展为24 |
结构体大小 | 理论为25,必须为4的倍数,故为28 |
阅读更多
- 我计算结构体和联合体大小的方法
- C/C++结构体大小的计算方法(Windows 32为处理器)
- C语言结构体,联合体,枚举体的内存大小计算方法
- [置顶] C/C++中结构体占用内存大小的计算方法
- 关于C语言字节对齐之结构体 共用体占用字节数的快速计算方法总结
- JAVA对象所占字节大小计算方法
- 结构体计算结构体字节大小以及字节对齐
- 结构体,联合的位域定义方法,以及结构体大小的计算
- 结构体在内存中所占字节大小计算
- sizeof&结构体、共同体大小的计算方法笔记
- 共用体和结构体所占内存大小的计算方法一
- C语言计算结构体占用字节大小总数
- 如何计算结构体的大小
- C++中类的大小计算方法总结
- C++ 内存对齐 (计算结构体的大小)
- 字节对齐与结构体大小
- sizeof()计算结构体的大小
- 内存对齐(计算结构体大小)方法
- 结构体字长计算方法
- 为什么用 ping 命令计算目标主机 MTU 时,缓冲区大小要减掉 28 字节,才是真正的MTU值?