So-net無料ブログ作成

FD2 シビックタイプR/RC79 VFR800F/サッカー/テニス/その他オタク成分による生存確認表明blog

ポインタの不思議 [C言語]

突然だが会社の同期からこんなことができると教えられた。

struct DATA {
  char a;
  char b;
  char c;
};

int main()
{
  struct DATA dat, *p_dat;
  p_dat = &dat;
  dat.a = 'A';

  printf("文字aは%c", *((char*)p_dat + 1));

  return 0;
}

細かいヘッダの記述とか割愛する。が、これ。信じられないことに、printfではばっちり'A'が出力される。この方法で構造体の中のメンバ「char a」にアクセスできるのだという。そんな馬鹿な。
どうも話を聞くと同期の友人がそういうことできるといっているらしい。もう一度言う。そんな馬鹿な。

色々理由を考えてみた。まず、構造体のサイズはcharの1バイト3つ分になるはず。んで、p_datの指し示す参照先から、char型のポインタサイズ1つ分をインクリメントすると、実際に構造体のアドレスにchar a, b, cの領域が連続してメモリ領域に格納されていると考えれば、確かにできないこともない。だがこれはあくまでも仮説だ。

さらに話を聞いてみると、聞けばその彼はマイコンの制御に携わっているという。曰く、「CPUに負荷を掛けない方法」だとか。ちなみに、俺が同じことをしろと言われれば、当然 p_dat->a で表示させる。理屈云々が知りたいのはもちろんのことだが、それよりもこれがCPU負荷を軽減させる根拠が知りたい。p_dat->aは実行時にアドレスが決定するわけではあるまい。残念ながら俺はアセンブラが読めない人間なので、マシン語レベルでこれがどういう解釈の違いをするかわからない。

とにかく俺は、ポインタ型をキャストしてインクリメントするサイズを強引に変更してメンバにアクセスする、という方法は処理系依存のような気がするんだが、どうなんだろう。それともそのマイコンの処理系独自の最適化では、そっちのほうがはるかにCPU負荷が軽くなるとかあるんだろうか。知っている人がいたらぜひ教えてほしい。



nice!(0)  コメント(0) 
人気ブログランキングへ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。