dポイントプレゼントキャンペーン実施中!

構造体のサイズのことですが、ご存知の方がいたら教えてください。
まず、↓のプログラムを実行させたのですが、
#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です。

A 回答 (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
でした。
    • good
    • 0

Cの言語仕様にはありませんが、VC++使っているのなら


#pragma pack
でいかがでしょう?

参考URL:http://mag.autumn.org/Content.modf?id=2005043001 …
    • good
    • 0

freadでデータを読むなら構造体ごと書き込まずにメンバー毎に書けばどうでしょう。


それならパディングに影響を受けませんが。
    • good
    • 0

構造体境界(アライメント)の問題ですね。


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

おそらくVisualCでも同様に対応できるとおもいます。
    • good
    • 0

> freadで構造体分のサイズを読み込もうとしたときにエラーが発生していました。



どんなソースコードを書いて実行したときに、
どんなエラーが出たのでしょうか?
このあたりを具体的に提示してくださると、
回避策が見つかるかもしれません。見つからないかもしれません。
    • good
    • 0

構造体のアライメントからこの状態が発生します。


詳細は参考URLを参照下さい。

参考URL:http://www.g-ishihara.com/c_st_01.htm
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。

アライメントを回避するには並び順を工夫すればよいわけですね。

お礼日時:2008/03/18 22:26

構造体のメンバーの並び順(型がからみます)によっては、


メンバーどうしの間に「パディング(詰め物)」という
どのメンバーにも割り当てられていない領域が生じる場合があります。

「構造体 パディング」あたりでググってみると、
解説しているサイトが見つかるかもしれません。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。

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

お礼日時:2008/03/18 22:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!