boolとBOOLの違い(構造体)とは?

このQ&Aのポイント
  • C++プログラマーが恥ずかしい質問ですが、Borland C++ Builder 9でアプリ開発中にboolとBOOLが混在していることに気付きました。
  • その中にはsizeof()でサイズを計算してみたところ、TEST_Aは46バイト、TEST_Bは52バイトという結果が出ています。
  • BOOLは4バイトと思っていたので、TEST_Bがなぜ52バイトになるのかわかりません。質問にお答えいただける方がいらっしゃいましたら、教えていただけると幸いです。
回答を見る
  • ベストアンサー

bool と BOOL の違い(構造体)

C++プログラマーとしてはとっても恥ずかしいタイトルですが。。。 Borland C++ Builder 9でアプリ開発してます。 訳あって、既存のアプリ(BCB6)を改造して別のアプリを作る業務を引き継いだのですが、修正する度に可笑しな動作をするのでソースを調べてみたら。。。 『boolとBOOLが混在してる(・・;)』 「ダメダメアプリ」に頭を抱えている今日この頃です。 前置きはさておき、質問ですが、 この「ダメダメアプリ」の中に2種類の構造体 typedef struct _TEST_A{ bool flag; char ch[45]; }TEST_A; と typedef struct _TEST_B{ BOOL flag; char ch[45]; }TEST_B; があるのですが、それぞれsizeof()でサイズを計算すると、 sizeof(TEST_A) = 46 sizeof(TEST_B) = 52 という結果になりました。 BOOLは4バイトなので49バイトかと思ったのですが、 TEST_Bが52になる理由がわかりません。 どなたかわかる方いらっしゃったら教えてください。

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

  • ベストアンサー
  • R_Earl
  • ベストアンサー率55% (473/849)
回答No.1

構造体のサイズは、メンバのサイズの和では無いからです。 Google等でキーワード「構造体のサイズ」で検索をかけると、 答えが見つかるはずです。

hiroki_vv
質問者

お礼

早速の回答ありがとうございました。 キーワードで検索して納得しました。

その他の回答 (2)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.3

C/C++の基本ですね。 構造体やクラスなどはコンパイラによって、 パディング処理が行われ、 バイトアライメントが起こります。 回避方法は環境によって異なります。

hiroki_vv
質問者

お礼

早速の回答ありがとうございました。 納得しました。

  • arain
  • ベストアンサー率27% (292/1049)
回答No.2

それは、同じソース上にありますか? また、コンパイルオプションなども一緒ですか? サイズからすると、メモリセグメンテーションによるもののようですが。 単純に書くと、「メモリ管理上キリのいい単位でアクセスできる場所ににメモリ確保していくため、構造体要素の合計サイズにならない」ということです。 とりあえず、「bool」と「BOOL」をsizeof()でサイズをチェックしてください。 bool=1、BOOL=4or1になると思います。 セグメンテーションが「4」であれば、 flagは先頭から1番地目に取られますが、ch[]は1番地目ではなく、キリのいい4番地目から確保されます。 このとき、確保されるサイズも45ではなく、キリのいい48で確保されます。 そのため「4+48=52」となります。

hiroki_vv
質問者

お礼

早速の回答ありがとうございました。 納得しました。

関連するQ&A

  • C言語の構造体のサイズについて

    いつもお世話になっていります。 早速ですが、C言語の構造体のサイズについて教えてください。 typedef struct B { short code; char name; float price; } B; typedef struct A { B bbb[10]; double sougaku; } A; A aaa; といった構造体があった場合に、 sizeof(aaa.bbb.code) + sizeof(aaa.bbb.name) + … + sizeof(aaa.sougaku) という風に一つ一つサイズを取得し、合計して構造体のサイズを取得した場合と sizeof(aaa) という風に構造体のサイズを取得した場合のサイズの値が異なるといった現象が起きます。 その原因が分からなくて困っております。 そこで考えられる要因をお教えください。 因みに実際の構造体はサイズで言えば2500バイトくらいあります。 froat/char/double/short 型を使用しております。 よろしくお願いします。

  • 構造体のmemcpy書き込む

    struct{ char a; char b; } test01_t struct{ char c; char d[3]; } test02_t struct{ test01_t test01; test02_t test02; } 書き込み先の領域の先頭アドレス char* Addr; データ構造が以下になっている状態で、 struct{ test01_t test01; test02_t test02; } test01_t test01の領域には書き込まず test02_t test02の情報だけ 領域にmemcpyまたはその他の方法で書き込みむにはどうしたらよいでしょうか? よろしくお願い致します。

  • 入れ子の構造体について

    例えば、入れ子の構造体を1つ使いたい場合、 struct bbb{ int b; }; typedef struct aaa{ struct bbb a; }AAA; AAA dt; と書くと、「dt.a.b = 10」とやれば、値等を設定できると思いますが、 入れ子の構造体を2つ使いたい場合も、同じように書けるのでしょうか? struct ccc{ int c; }; struct bbb{ struct ccc b; }; typedef struct aaa{ struct bbb a; }AAA; AAA dt; dt.a.b.c = 10; と書けるのでしょうか?こんがらがってしまって、どう書いていいのか・・。 2つでも出来るのであれば、コードの書き方を教えて頂けませんか?

  • 構造体のメンバーの静的なサイズ取得

    構造体のメンバーをヘッダーファイル中で得たい場合、 以下のような方法以外になにか方法はないでしょうか? 単純に XXXX x;と宣言してそれを sizeof(x.chwk)と 使うというような方法以外で なにかあれば教えてください。 ---------------------------------------- typedef struct { char chwk[100]; } XXXX; typedef struct { char chwk[ sizeof(( (XXXX*)0)->chwk ) ]; } YYYY; main(int arc, char *arg[] ){ YYYY y; printf( " YYYY chwk size = %d\n", sizeof(y.chwk)); }

  • C++でCの構造体をnewするとまずいのでしょうか?

    以下のようなCで書かれたヘッダがあったとして ---testc.h--- typedef struct __Test { int i; char c[30]; char* x; } Test; これを以下のようにnewして使うのは問題ないでしょうか? ---test.cpp--- extern "C" { #include test.h } int main(void) { Test* test = new Test(); test->i = 30; test->c[3] = 'a'; test->x = "aiueo"; return 0; }

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

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

  • 条件によって構造体のリスト構造を変えたい

    こんにちは。 C(C++)で構造体を使っているのですが、まだまだ未熟で使い方が良く分かりません。以下のことを実施したいのですが、やり方をどなたかご教授頂けませんでしょうか。よろしくお願いします。 条件によって構造体のリスト構造を変えたいのです。 例えば、 条件1の場合は 構造体a→構造体b 条件2の場合は、 構造体a→構造体c 上記のようにです。そして構造体のルートから参照先をたどっていくことで、配下の構造体の値を取得したいのです。 文法上許されないようですが、イメージとしては、 struct a aa; aa.c->b.aa ということをしたいのです。よろしくお願いします。 struct a{ char a; char b; struct c; : }; struct b{ char aa; : }; struct c{ : : };

  • 構造体のメンバ初期化について

    構造体のメンバを初期化したいのですが、 メンバ数が多いので1個ずつ初期化するのは面倒です。 そのため、一度に初期化する方法を探していたのですが、 memsetやZeroMemoryなどで可能だということが解りました。 しかし、パディング等の問題を含めて この関数を使用しても問題ないのでしょうか? 以下に例を挙げます。 typedef struct SAMPLE {  char a;  int b;  int c;  float d;  SAMPLE(){   ZeroMemory( this, sizeof(Sample) );  } } Sample; 構造体Sampleは32bitマシンでは 一見13byteに見えますが、パディングが入るので、 実際にはsizeof(Sample)は16byteと表示されます。 また、構造体には自動的に初期化と解放するための、 コンストラクタ・デストラクタのみがあり、 関数や仮想関数などの実装はありません。 この方法の安全性について、 ご存知の方がいらっしゃればアドバイスいただけると助かります。 よろしくおねがいします

  • 構造体へのポインタについて

    初心者です。 C入門書の著者のサポートページには正誤表とダウンロードしかないためこちらで質問させていただきます。 下記のコードの下から二行目の構造体へのポインタ (Car *) について、中学生に説明するように基本的な考え方、目的、書式、参考URLなどを教えて下さい。 ポインタについては、該当の章を読み直し基本事項については理解しておりますが、突然あるページから(Void *)や(Char *)など括弧で閉じるものが説明なしに出てきてちょっと混乱してます。(汗 どうぞ宜しくお願い致します。 #include<stdio.h> /* 構造体型struct Carの宣言 */ typedef struct Car{ int num; double gas; }Car; int main(void) { printf("int型のサイズは%dバイトです。¥n", sizeof(int)); printf("double型サイズは%dバイトです。¥n", sizeof(double)); printf("構造体structCar型のサイズは%dバイトです。¥n", sizeof(Car)); printf("構造体struct Car型へのポインタのサイズは%dバイトです。¥n", sizeof(Car *)); return 0; }

  • 構造体の中の構造体

    typedef struct number{ int x; struct number *next; }Num; 初心者な質問で申し訳ないんですが、構造体の中に構造体があるのはどう解釈していいんでしょうか? typedef struct number{ int x; int y; }Num; の場合はNum a,b;がint a.x,a.y,b.x,b.yとなるのは分かるんですが・・・