结构填充是否可以由用户代码安全使用?

假设我有一个如下所示的结构:

struct Struct { char Char; int Int; }; 

sizeof( int )大于1并且编译器为Char成员变量添加填充 – 编译器生成的代码是否允许更改填充字节的值?

我的意思是,如果我使用指针运算并将一些数据写入Char成员变量周围的填充字节,然后执行variable.Char =赋值,编译器生成的代码是否也可能会覆盖某些填充字节?

以下句子是错误的 :不,它不会覆盖填充字节。 但使用它可能不是一个好习惯。 如果需要,可在其中添加成员变量。

我根据评论指出( 正确 )我是愚蠢的:

C标准有一个“附件J”,其中J.1部分未指明行为 。 它说,“在结构或联合中存储值时填充字节的值”。 这意味着编译器可以生成它想要将数据写入结构的任何指令,这可以允许它在成员之后覆盖填充。

如果编译器足够聪明以使用单词写入来保存字符怎么办? 您精心保存的数据将丢失。 😉

你肯定可以在那里写一些东西,并且memset an这样的结构的实例就是这样。 但是,这样做并不安全,绝不是一个好主意 。 有一天,另一个开发人员将#pragma放在某处或者将一个成员添加到struct声明中,并且你的代码会以许多奇怪和奇特的方式爆炸,这可能需要很长时间才能进行调试。

这样做的唯一原因就是插件可以欺骗主机应用程序来存储额外的数据。

不要这样做,因为在未来的某个时刻它破裂,这对所有相关人员来说都是一个严重的问题。