7

假设这段代码:

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吗?
还是取决于系统的字节顺序或内存对齐方式?

4

2 回答 2

7

让我们剖析一下。

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

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

因此,s->a == 1永远是真的。如果实现将unsigned chars 放在struct相邻的位置(大多数会),那么其他等式必然为真。

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

于 2010-06-02T20:40:31.423 回答
4

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

于 2010-06-02T19:57:49.187 回答