根据C语言标准,编译器可以自动添加填充字节以对齐结构体变量,但是不允许修改用户显式定义的填充字节。以下代码示例可以说明这一点:
#include
struct test {
char ch1; // 1字节
int i; // 4字节
char ch2; // 1字节
}__attribute__((packed)); // 关闭对齐
int main() {
struct test t = {'a', 123, 'b'};
printf("sizeof(t)=%zd\n", sizeof(t)); // 结果为6
return 0;
}
上述代码中,结构体test中有两个char类型的成员变量,它们之间隐含一个3字节的填充字节以对齐下一个int类型的成员变量。在__attribute__((packed))的指令下关闭对齐,sizeof(t)计算结果仍为6,编译器不会修改填充字节。