
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になる理由がわかりません。
どなたかわかる方いらっしゃったら教えてください。
No.3
- 回答日時:
C/C++の基本ですね。
構造体やクラスなどはコンパイラによって、
パディング処理が行われ、
バイトアライメントが起こります。
回避方法は環境によって異なります。
No.2
- 回答日時:
それは、同じソース上にありますか?
また、コンパイルオプションなども一緒ですか?
サイズからすると、メモリセグメンテーションによるもののようですが。
単純に書くと、「メモリ管理上キリのいい単位でアクセスできる場所ににメモリ確保していくため、構造体要素の合計サイズにならない」ということです。
とりあえず、「bool」と「BOOL」をsizeof()でサイズをチェックしてください。
bool=1、BOOL=4or1になると思います。
セグメンテーションが「4」であれば、
flagは先頭から1番地目に取られますが、ch[]は1番地目ではなく、キリのいい4番地目から確保されます。
このとき、確保されるサイズも45ではなく、キリのいい48で確保されます。
そのため「4+48=52」となります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DLLのマルチスレッドの動作につ...
-
c言語のポインタへの文字列入力...
-
メモリ解放について
-
ヒープメモリの解放について
-
allocってなんですか?
-
dllを使用しVB側に文字列...
-
大容量の静的な確保の限界値
-
領域の確保について
-
malloc呼び出し時のセグメンテ...
-
構造体の配列について(2)
-
アンマネージド関数でのメモリ...
-
MFCのCStringについて
-
関数から配列を返すには?
-
C言語 配列の長さの上限
-
VBAのプログラムで、DIAG = 1# ...
-
System.IO.Directory.GetFiles...
-
char*を初期化したいのですが
-
あるディレクトリ内のファイル...
-
Integer変数をカラにしたいので...
-
「#undef」と「#define」の使い...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
ビットをローテートするプログ...
-
ヒープメモリの解放について
-
newしないオブジェクトについて
-
構造体でchar name[]と*nameの...
-
ポインタのポインタの初期化法
-
行列内の行の交換,列の交換を...
-
C++で、メンバもヒープに確保さ...
-
DLLのマルチスレッドの動作につ...
-
配列の添え字の最大数とは?
-
mallocで確保するメモリの領域...
-
C++のnewで確保したメモリーの...
-
C言語に関する質問
-
Win32APIでのメモリ管理について
-
変数に文字列を代入する方法を...
-
領域の確保について
-
free関数で動作が止まる
-
CreateFileMapping について
-
指定したメモリアドレスの値の...
おすすめ情報