• ベストアンサー

構造体のサイズが意味不明の数になります・・・

構造体のサイズのことですが、ご存知の方がいたら教えてください。 まず、↓のプログラムを実行させたのですが、 #include<iostream> using namespace std; struct test{ short a; int b; short c; }; int main(){ cout<<sizeof(test); return 0; } 結果として8が出力されることを予想していましたが、なぜか12が出力されました。 shortは4バイトだったのかな、と思ったのですが cout<<sizeof(short); でやってみたところ結果はやはり2でした。 もちろん cout<<sizeof(int); の結果は4です。 さらに分からない所は struct test{ int b; short a; short c; }; int main(){ cout<<sizeof(test); return 0; } このように構造体の中身を入れ替えたところ正しく8が出力されました。 visual c++ 2008 express editionを使っています。 OSはvistaです。

質問者が選んだベストアンサー

  • ベストアンサー
  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.7

No.6です。 手元にVCなかったので確認できなかったのですが、 GCCで期待通りに動作しましたので一応追記します。 #include <stdio.h> #pragma pack(push,1) volatile struct test{ short a; int b; short c; }; int main(void) { printf("%d\n", sizeof(struct test)); } を実行したところ、 $ ./test 8 と出力が得られました。 gccで使えるとは私も知りませんでした。びっくり。 ちなみにpackしないときは $ ./test 12 でした。

その他の回答 (6)

  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.6

Cの言語仕様にはありませんが、VC++使っているのなら #pragma pack でいかがでしょう?

参考URL:
http://mag.autumn.org/Content.modf?id=20050430014843
  • Lbfuvab
  • ベストアンサー率36% (7/19)
回答No.5

freadでデータを読むなら構造体ごと書き込まずにメンバー毎に書けばどうでしょう。 それならパディングに影響を受けませんが。

  • techa
  • ベストアンサー率60% (41/68)
回答No.4

構造体境界(アライメント)の問題ですね。 私も以前、DOSのソフトからWindowsソフトへの移植のときに ぶつかりました。 私の場合はBorland C++Builderだったのですが、 #pragma pack(push,1) 構造体の定義.... #pragma pack(pop) という風にしてやるだけで対応できました。 pushの引数1は1バイト境界にするという意味で、 質問者さんの場合は2を指定すればよさそうです。 (私の場合はcharが多く含まれていたので、1にしていました) おそらくVisualCでも同様に対応できるとおもいます。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

> freadで構造体分のサイズを読み込もうとしたときにエラーが発生していました。 どんなソースコードを書いて実行したときに、 どんなエラーが出たのでしょうか? このあたりを具体的に提示してくださると、 回避策が見つかるかもしれません。見つからないかもしれません。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

構造体のアライメントからこの状態が発生します。 詳細は参考URLを参照下さい。

参考URL:
http://www.g-ishihara.com/c_st_01.htm
sorokuku
質問者

お礼

早速の回答ありがとうございます。 アライメントを回避するには並び順を工夫すればよいわけですね。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

構造体のメンバーの並び順(型がからみます)によっては、 メンバーどうしの間に「パディング(詰め物)」という どのメンバーにも割り当てられていない領域が生じる場合があります。 「構造体 パディング」あたりでググってみると、 解説しているサイトが見つかるかもしれません。

sorokuku
質問者

お礼

早速の回答ありがとうございます。 実際作ったプログラムでは、freadで構造体分のサイズを読み込もうとしたときにエラーが発生していました。 しかし、余分な領域ができてしまうなら、この方法はあんまり良くないかもしれないですね。

関連するQ&A

専門家に質問してみよう