如下结构体所示,后面要补1个字节var1
,因为short
在结构体中使用,所以要在后面补1个字节var3
。有了这个,总数应该是 6。这就是我在 Visual Studio 中得到的值。Wikipedia on Data structure alignment也提到了这一点。
typedef struct {char var1; short var2; char var3;} Bytes;
但在 GCC 中,它给出的大小为 8 个字节。请让我知道这种行为。
嗨,杰克,
我对以下结构进行了实验。
typedef struct
{
char charVar1;
short shortVar2;
char charVar3;
}tsByte;
printf("\n Sizeo of Byte : %d", sizeof(Byte));
printf("\n Sizeo of charVar1 : %d", sizeof(Byte.charVar1));
printf("\n Sizeo of shortVar2 : %d", sizeof(Byte.shortVar2));
printf("\n Sizeo of charVar3 : %d", sizeof(Byte.charVar3));
printf("\n Address of charVar1 : %x", &Byte.charVar1);
printf("\n Address of shortVar2 : %x", &Byte.shortVar2);
printf("\n Address of shortVar3 : %x", &Byte.charVar3);
结果如下。
Sizeo of Byte : 8
Sizeo of charVar1 : 1
Sizeo of shortVar2 : 2
Sizeo of charVar3 : 1
Address of charVar1 : 4007e90
Address of shortVar2 : 4007e92
Address of shortVar3 : 4007e94
当结构用作数组的元素时,通常需要在结构的末尾填充以确保正确对齐(其所有成员)。但有点混淆了最后一个元素的填充。填充“最后一个元素”是基于 8/16/32 位控制器架构还是基于最大成员大小(这里简称)。
我觉得在 Visual Studio 中它基于最大的成员大小,所以你得到的大小为 6 个字节。而使用 gcc 编译器,它基于控制器架构,并且由于我使用的是 32 位控制器,它与 4 字节内存对齐。因此在 gcc 编译器中它是 8 个字节。如果我错了,请纠正我。