c 语言结构体 padding 的问题
C 语言结构体中的每个成员都需要按照相应的大小进行内存对齐,编译器会在结构体成员之间插入 padding 字节来保证每一个成员都能够以对应的数据大小对齐。
padding 区域的存储字节,对程序员来说是不可见的,对整个结构体的初始化赋值不会改变 padding 区域的值。
请看下面的初始化代码:
struct mystruct a = {0};
它仅将 mystruct 的所有成员的值清零,不会使 padding 区域清零。如果你需要确保所有的区域都设置为零,你可以使用 memset 来完成。
你也可以使用 gcc 的扩展语法来阻止 padding
语法如下:
__attribute__((packed))
#pragma pack(1)
上述功能为 gcc 的扩展语法,它会告诉编译器不要插入 padding 字节,这样可能会造成成员变量的地址不对齐,是一个潜在的安全隐患。
对于不支持非对齐访问的处理器而言,结构体成员变量的未对齐地址可能会造成总线错误,导致程序异常终止,也可能会读到变量的部分值。