如果我们在结构中有一个数组:

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/

10-11 18:13