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