如果我们在结构中有一个数组:
struct Names
{
uint8 fileId;
uint8 name[50];
};
然后尝试将数组中的uint16分配给uint16变量,例如:
uint16 someName = *((uint16 *)&NamesObj.name[21]);
这会违反混叠规则/对齐规则并导致不确定的行为吗?
最佳答案
是的,这违反了C规则。 name
中的对象是uint8
(大概是一些无符号的8位整数类型),可以通过指向uint16
(大概是16位整数类型)的指针来访问它们。
来自N1570草案的2011 C标准的相关部分为6.5 7:
一个对象只能通过具有以下类型之一的左值表达式访问其存储值:
—与对象的有效类型兼容的类型,
—与对象的有效类型兼容的类型的限定版本,
—是与对象的有效类型相对应的有符号或无符号类型的类型,
—一种类型,是与对象的有效类型的限定版本相对应的有符号或无符号类型,
—集合或联合类型,其成员中包括上述类型之一(递归地包括子集合或包含的联合的成员),或
—字符类型。
类型uint16
都不是这些。
关于c - 结构中的阵列是否会出现混淆/对齐问题?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48799736/