次のコードを想定します。
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
に3つのメンバーがあります。list
list + 1
list + 2
の状況struct
はそれほど明確ではありません。標準は、メンバーが増加するメモリ位置に割り当てられることを保証しますが、それらが隣接することは保証しません。コンパイラーは、メンバー間にパディングを導入し、最後にパディングを自由に導入できます。
したがって、s->a == 1
常に真になります。実装がunsigned char
sをstruct
隣接する(そしてほとんどの場合)に配置する場合、他の等式は必然的に真になります。
ちなみに、を呼び出すstruct
_struct
と問題が発生する可能性があります。グローバル名前空間でアンダースコアで始まる名前は、実装用に予約されています。
はい、それはシステムとコンパイラのメモリアライメントとパッキングルールに依存します。