假设我有一个如下结构:
struct Struct {
char Char;
int Int;
};
并且sizeof( int )
大于一并且编译器为Char
成员变量添加填充 - 编译器生成的代码是否允许更改填充字节的值?
我的意思是,如果我使用指针算法并将一些数据写入Char
成员变量周围的填充字节,然后进行variable.Char =
赋值,编译器生成的代码是否也可能会覆盖一些填充字节?
如果编译器足够聪明,可以使用单词 write 来保存 char 怎么办?您精心保存的数据将会丢失。;-)
下面这句话是错误的: 不,它不会覆盖填充字节。但使用它可能不是一个好习惯。如果需要,请在此处添加成员变量。
我根据表明(正确)我很愚蠢的评论进行了研究:
C 标准有一个“附件 J”,其中包含第J.1 节未指定的行为。它说,“在结构或联合中存储值时填充字节的值”。这意味着编译器可以生成它想要将数据写入结构的任何指令,这可能允许它覆盖成员之后的填充。
你当然可以在那里写一些东西,然后memset
-ing 一个这样的结构的实例就可以了。但是,这样做并不安全,也不是一个好主意。有一天,另一个开发人员在#pragma
某个地方放置了一个或向结构声明添加了一个成员,您的代码将以许多奇怪而奇特的方式爆炸,这可能需要相当长的时间来调试。
这样做的唯一原因可能是某个插件恶意欺骗主机应用程序存储额外数据。
但是不要这样做,因为在未来的某个时候它会破裂,这对所有相关人员来说都是一个严重的头痛。