admin管理员组

文章数量:1576352

c 语言结构体 padding 的问题

C 语言结构体中的每个成员都需要按照相应的大小进行内存对齐,编译器会在结构体成员之间插入 padding 字节来保证每一个成员都能够以对应的数据大小对齐。

padding 区域的存储字节,对程序员来说是不可见的,对整个结构体的初始化赋值不会改变 padding 区域的值。

请看下面的初始化代码:

 struct mystruct a = {0};

它仅将 mystruct 的所有成员的值清零,不会使 padding 区域清零。如果你需要确保所有的区域都设置为零,你可以使用 memset 来完成。

你也可以使用 gcc 的扩展语法来阻止 padding

语法如下:

	__attribute__((packed))
	#pragma pack(1)

上述功能为 gcc 的扩展语法,它会告诉编译器不要插入 padding 字节,这样可能会造成成员变量的地址不对齐,是一个潜在的安全隐患。

对于不支持非对齐访问的处理器而言,结构体成员变量的未对齐地址可能会造成总线错误,导致程序异常终止,也可能会读到变量的部分值。

本文标签: 语言结构padding