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

时间:2010-06-02 19:54:36

标签: 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; 

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

2 个答案:

答案 0 :(得分:7)

让我们剖析一下。

在所有情况下,sizeof(char) == 1list数组都会在内存位置listlist + 1list + 2拥有三个成员。

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

因此,s->a == 1将永远为真。如果实现将unsigned char放在struct邻近(并且大多数意愿),则其他等式必然为真。

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

答案 1 :(得分:4)

是的,它取决于系统和编译器的内存对齐和打包规则。