将字节数组转换为结构指针取决于字节顺序或内存对齐?

Pet*_*uza 7 c++ struct endianness memory-alignment

假设这段代码:

unsigned char list[3] = { 1, 2, 3 };
struct _struct{
  unsigned char a;
  unsigned char b;
  unsigned char c;
} *s;
s = ( _struct * ) list; 
Run Code Online (Sandbox Code Playgroud)

我能一直假设s->a == 1, s->b == 2, s->c == 3吗?
或者它将取决于系统的字节顺序或内存对齐?

Dav*_*ley 7

让我们剖析一下.

在所有情况下,sizeof(char) == 1list阵列将拥有三个成员的存储位置list,list + 1list + 2.

这种情况struct并不十分清楚.标准保证成员将被分配到增加的内存位置,但不是它们将是连续的.编译器可以自由地在成员之间引入填充,并在末尾填充.

因此,s->a == 1永远都是如此.如果实现将unsigned chars放在struct相邻(和大多数意志)中,则其他等式必然为真.

顺便说一句,调用struct _struct可能会导致问题.在全局命名空间中以下划线开头的名称保留用于实现.