c语⾔中结构体int的长度是⼏,c语⾔struct结构体⼤⼩计算⽅法struct结构体⼤⼩的计算⽅法
1)第⼀个成员处在偏移地址0的地⽅
2)每个成员按其类型⼤⼩和pack参数中较⼩(编译器默认#pragma pack(4) 4字节对齐)的⼀个进⾏对齐
偏移地址必须能被对齐参数整除
结构体成员的⼤⼩取其内部长度最⼤的数据成员作为其⼤⼩
3)结构体的总长度必须为所有对齐参数的整数倍
编译器默认4字节对齐,#pragma pack(x) 能够改变编译器的默认对齐⽅式
下⾯⼏个例⼦是结构体⼤⼩的计算过程
#include #pragma pack(4)
struct Test1
{ //对齐参数 偏移地址 ⼤⼩
char c1;//1 0 1
short s; //2 2 2
char c2;//1 4 1
int i; //4 8 4
};
#pragma pack()
//总长度为12 是所有对齐参数的整数倍
#pragma pack(4)
struct Test2
{ //对齐参数 偏移地址 ⼤⼩
char c1;//1 0 1
char c2;//1 1 1
short s; //2 2 2
int i; //4 4 4
};
#pragma pack()
//总长度为8 是所有对齐参数的整数倍
#pragma pack(4)
struct Test3
{ //对齐参数 偏移地址 ⼤⼩
char c1;//1 0 1
short s; //2 2 2
char c2;//1 4 1
};
#pragma pack()
//总长度为6 是所有对齐参数的整数倍
int main()
{
printf("sizeof(Test1) = %d\n", sizeof(struct Test1));
printf("sizeof(Test2) = %d\n", sizeof(struct Test2));
printf("sizeof(Test3) = %d\n", sizeof(struct Test3));
c语言struct头文件return 0;
}
下⾯是⼀个包含结构体成员的结构体⼤⼩计算
#include #pragma pack(8) //按照8字节对齐
struct S1
{ //对齐参数 偏移地址 ⼤⼩
short a; //2 0 2
long b; //4 4 4
};
//总长度为8 是所有对齐参数的整数倍
struct S2
{ //对齐参数 偏移地址 ⼤⼩
char c; // 1 0 1
struct S1 d; // 4 4 8
double e; // 8 16 8
};
//结构体成员的对齐参数为结构体成员内部最⼤的那个 对于S1来说 长度最⼤的成员为long 对齐参数为4 //总长度为24 是所有对齐参数的整数倍
#pragma pack()
int main()
{
printf("%d\n", sizeof(struct S1));
printf("%d\n", sizeof(struct S2));
return 0;
}
gcc中的运⾏结果如下
8
20
为什么不是24呢? 因为在gcc中暂不⽀持8字节对齐所以实际上struct S2的对齐⽅式为
struct S2
{ //对齐参数 偏移地址 ⼤⼩
char c; // 1 0 1
struct S1 d; // 4 4 8
double e; // 4 12 8
};
//得到实际长度为20
在VC中可以得到
8
24
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论