开发者

Casting a byte array to a struct pointer depends on endianness or memory alignment?

Suppose this code:

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

Can I assume that always s->a == 1, s->b == 2, s->c == 3 ?

Or it will depend on the system's endiannes开发者_Python百科s or memory alignment?


Let's dissect this.

In all cases, sizeof(char) == 1, and the list array will have its three members at memory locations list, list + 1, and list + 2.

The situation with the struct is not quite as clear. The Standard guarantees that the members will be allocated in increasing memory locations, but not that they will be contiguous. The compiler is free to introduce padding between members, and padding at the end.

Therefore, s->a == 1 will always be true. If the implementation puts the unsigned chars in the struct adjacent (and most will), then the other equalities will necessarily be true.

By the way, calling a struct _struct may cause problems. A name beginning with an underscore in the global namespace is reserved for the implementation.


Yes, it will depend on the system's and compiler's memory alignment and packing rules.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜