问一个关于对齐的问题
#include<stdio.h>
#pragma pack(1)
struct struct5
{
long long4;
char char1;
}st5;
#pragma pack(8)
struct structx
{
struct struct5 x;
char y;
}stx;
main()
{
printf("5size is %d.\n", sizeof(str5));
printf("xsize is %d.\n", sizeof(strx));
}
上面这段代码运行结果为
5size is 5.
xsize is 6.
我想问一下,为什么对齐值已经重新设为8了,结构体strx的大小还是只有6而不是取4(long型的长度)的倍数8呢?
[解决办法]
#pragma pack(1)
struct struct5
{
long long4;
char char1;
}st5;
单纯从内存 可以看成是
struct struct5
{
char long[4];
char char1;
}
那么 下面的
struct structx
{
struct struct5 x;
char y;
}stx;
其实是
struct structx
{
char x[5]
char y;
}stx;
[解决办法]
#pragma pack(n)设定以n字节对齐方式。
内置类型:
第一、如果n大于等于该变量类型默认的对齐字节数,那么取默认的对齐字节数。
第二、如果n小于该变量的类型默认对齐字节数,那么该类型的对齐字节数为n。
结构体:
结构的对齐字节数为所有成员的中最大的对齐字节数,结构体占用字节数必须为对齐字节数的整数倍。
数组:
数组的对齐字节数为其元素类型的对齐字节数,占用空间为元素占用空间*数组长度
pack(1)作用范围包含struct5。
struct5的对齐为1,占用空间为5。
pack(8)作用范围包含structx。不包含struct5。
structx的对齐为1,占用空间为6。
[解决办法]
struct structx有作用
{
struct struct5 x;
char y;
}stx;
