假设此代码:
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
吗?
或者它取决于系统的字节顺序或内存对齐?
答案 0 :(得分:7)
让我们剖析一下。
在所有情况下,sizeof(char) == 1
和list
数组都会在内存位置list
,list + 1
和list + 2
拥有三个成员。
struct
的情况并不十分清楚。标准保证成员将被分配到增加的内存位置,但不是它们将是连续的。编译器可以自由地在成员之间引入填充,并在最后填充。
因此,s->a == 1
将永远为真。如果实现将unsigned char
放在struct
邻近(并且大多数意愿),则其他等式必然为真。
顺便说一下,调用struct
_struct
可能会导致问题。在全局命名空间中以下划线开头的名称保留用于实现。
答案 1 :(得分:4)
是的,它取决于系统和编译器的内存对齐和打包规则。