- ベストアンサー
構造体のサイズが意味不明の数になります・・・
構造体のサイズのことですが、ご存知の方がいたら教えてください。 まず、↓のプログラムを実行させたのですが、 #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です。
- みんなの回答 (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)
Cの言語仕様にはありませんが、VC++使っているのなら #pragma pack でいかがでしょう?
- Lbfuvab
- ベストアンサー率36% (7/19)
freadでデータを読むなら構造体ごと書き込まずにメンバー毎に書けばどうでしょう。 それならパディングに影響を受けませんが。
- techa
- ベストアンサー率60% (41/68)
構造体境界(アライメント)の問題ですね。 私も以前、DOSのソフトからWindowsソフトへの移植のときに ぶつかりました。 私の場合はBorland C++Builderだったのですが、 #pragma pack(push,1) 構造体の定義.... #pragma pack(pop) という風にしてやるだけで対応できました。 pushの引数1は1バイト境界にするという意味で、 質問者さんの場合は2を指定すればよさそうです。 (私の場合はcharが多く含まれていたので、1にしていました) おそらくVisualCでも同様に対応できるとおもいます。
- asuncion
- ベストアンサー率33% (2127/6289)
> freadで構造体分のサイズを読み込もうとしたときにエラーが発生していました。 どんなソースコードを書いて実行したときに、 どんなエラーが出たのでしょうか? このあたりを具体的に提示してくださると、 回避策が見つかるかもしれません。見つからないかもしれません。
- tatsu99
- ベストアンサー率52% (391/751)
構造体のアライメントからこの状態が発生します。 詳細は参考URLを参照下さい。
- asuncion
- ベストアンサー率33% (2127/6289)
構造体のメンバーの並び順(型がからみます)によっては、 メンバーどうしの間に「パディング(詰め物)」という どのメンバーにも割り当てられていない領域が生じる場合があります。 「構造体 パディング」あたりでググってみると、 解説しているサイトが見つかるかもしれません。
お礼
早速の回答ありがとうございます。 実際作ったプログラムでは、freadで構造体分のサイズを読み込もうとしたときにエラーが発生していました。 しかし、余分な領域ができてしまうなら、この方法はあんまり良くないかもしれないですね。
お礼
早速の回答ありがとうございます。 アライメントを回避するには並び順を工夫すればよいわけですね。