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に3つのメンバーがあります。listlist + 1list + 2

の状況structはそれほど明確ではありません。標準は、メンバーが増加するメモリ位置に割り当てられることを保証しますが、それらが隣接することは保証しません。コンパイラーは、メンバー間にパディングを導入し、最後にパディングを自由に導入できます。

したがって、s->a == 1常に真になります。実装がunsigned charsをstruct隣接する(そしてほとんどの場合)に配置する場合、他の等式は必然的に真になります。

ちなみに、を呼び出すstruct _structと問題が発生する可能性があります。グローバル名前空間でアンダースコアで始まる名前は、実装用に予約されています。

于 2010-06-02T20:40:31.423 に答える
4

はい、それはシステムとコンパイラのメモリアライメントとパッキングルールに依存します。

于 2010-06-02T19:57:49.187 に答える