C言語なら俺に聞け! Part 119

このエントリーをはてなブックマークに追加
133デフォルトの名無しさん
#include <stdio.h>
#include <stdlib.h>

struct A {
int a;
int ab[20];
};
struct B {
char b;
int c;
};

int main( void ) {
struct A *pa = (struct A*)malloc(sizeof(struct A));
struct B *pb;
int i = 0;
pa->a = 10;
for (;i < 20; ++i)
pa->ab[i] = i + 1;
pb = (struct B*)pa; // pb には pa のアドレスが代入される ★
printf("%d\n",pb->b);
printf("%d\n",pb->c);
free(pa);
}

これがまずいというのはわかるのですが、この動作が予想できた人の考えが知りたいのです。
★の部分でアドレスを代入している訳ですが、pb->c で struct A a.ab[0] と同じ結果が出る理由がよくわかりません。
イメージとしては、struct A の全メンバを struct B に詰め込む感じなのでしょうか? それならば、アドレスを
代入する時点でエラーになりそうなのですが。
えっと…もしかしてアロー演算子はメンバ名に依存せず、型のサイズで評価対象を決めていたりするんでしょうか
訳がわかりませんね すみません、とにかくそんな状態なんです。ポインタについてはもう理解し終えたと勘違いしていた
手前、どこをどう読み直せば良いのかも検討がつきません。長文失礼します ご教示お願いします