c 语言结构体 padding 的问题

c 语言结构体 padding 的问题

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

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

请看下面的初始化代码:

 struct mystruct a = {0};

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

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

语法如下:

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

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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值