![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
構造体のサイズのことですが、ご存知の方がいたら教えてください。
まず、↓のプログラムを実行させたのですが、
#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です。
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
でした。
No.6
- 回答日時:
Cの言語仕様にはありませんが、VC++使っているのなら
#pragma pack
でいかがでしょう?
参考URL:http://mag.autumn.org/Content.modf?id=2005043001 …
No.4
- 回答日時:
構造体境界(アライメント)の問題ですね。
私も以前、DOSのソフトからWindowsソフトへの移植のときに
ぶつかりました。
私の場合はBorland C++Builderだったのですが、
#pragma pack(push,1)
構造体の定義....
#pragma pack(pop)
という風にしてやるだけで対応できました。
pushの引数1は1バイト境界にするという意味で、
質問者さんの場合は2を指定すればよさそうです。
(私の場合はcharが多く含まれていたので、1にしていました)
おそらくVisualCでも同様に対応できるとおもいます。
No.3
- 回答日時:
> freadで構造体分のサイズを読み込もうとしたときにエラーが発生していました。
どんなソースコードを書いて実行したときに、
どんなエラーが出たのでしょうか?
このあたりを具体的に提示してくださると、
回避策が見つかるかもしれません。見つからないかもしれません。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?5a7ff87)
No.2
- 回答日時:
No.1
- 回答日時:
構造体のメンバーの並び順(型がからみます)によっては、
メンバーどうしの間に「パディング(詰め物)」という
どのメンバーにも割り当てられていない領域が生じる場合があります。
「構造体 パディング」あたりでググってみると、
解説しているサイトが見つかるかもしれません。
早速の回答ありがとうございます。
実際作ったプログラムでは、freadで構造体分のサイズを読み込もうとしたときにエラーが発生していました。
しかし、余分な領域ができてしまうなら、この方法はあんまり良くないかもしれないですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
typedef enumの使い方を教えて...
-
変数の型を定義しなかった場合...
-
【#define】 defineで定義した...
-
DDVによるメッセージの変更
-
0除算を判定したい
-
C#でオセロを作っているのです...
-
intとINTの違いは?
-
C言語での方向キー入力判定
-
関数の実体定義にヘッダファイ...
-
64bit → 32bit型へのキャスト
-
C言語で分割ファイル先の関数を...
-
visualstudio C# テキストボッ...
-
エラー「invalid conversion fr...
-
C言語でのフィボナッチ数列の表示
-
enumについて
-
直接アドレス指定のポインタの...
-
構造体の要素すべてに対する四...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
typedef enumの使い方を教えて...
-
visualstudio C# テキストボッ...
-
C++のfor文について
-
関数の実体定義にヘッダファイ...
-
構造体の要素すべてに対する四...
-
ハンドルされていない例外が発...
-
C++でboolにintの値を代入する...
-
変数の型を定義しなかった場合...
-
intとINTの違いは?
-
main.c:7:43: warning: implici...
-
void func( void )について
-
C言語 宣言した変数になにも代...
-
【#define】 defineで定義した...
-
構造体の宣言でエラーが出ます。
-
C言語での方向キー入力判定
-
プログラムの中で別のmainを呼...
-
C言語について質問です。 子プ...
おすすめ情報