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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- C言語・C++・C# 競技プログラミングに関する質問です。 3 2022/04/03 19:51
- Excel(エクセル) フォルダ内のエクセルファイルを開かずにデータ採取する関数式 2 2022/12/22 22:15
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- PHP $_SESSIONについて教えて下さい。 2 2023/03/02 09:18
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- JavaScript [再掲]指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードについて 1 2023/05/10 15:09
- システム ホームページの仕組みについて 3 2022/08/16 14:33
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
newしないオブジェクトについて
-
大容量の静的な確保の限界値
-
ビットをローテートするプログ...
-
スタック破壊の上手な見つけ方...
-
stringの最大サイズ
-
グローバル変数のサイズ
-
malloc呼び出し時のセグメンテ...
-
allocってなんですか?
-
mallocで確保するメモリの領域...
-
ヒープ領域の限界値設定
-
fread関数および動的なメモリ確...
-
GDI+におけるメモリの開放について
-
行列内の行の交換,列の交換を...
-
gcnew arrayによるメモリ確保に...
-
C言語 mallocとfreeについて
-
構造体を使ったファイルの読み込み
-
bool と BOOL の違い(構造体)
-
プログラムが途中で強制終了し...
-
malloc()関数内でセングメント...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
mallocについて
-
配列の添え字の最大数とは?
-
ヒープメモリの解放について
-
ビットをローテートするプログ...
-
C++で、メンバもヒープに確保さ...
-
malloc呼び出し時のセグメンテ...
-
プログラムが途中で強制終了し...
-
スタック破壊の上手な見つけ方...
-
指定したメモリアドレスの値の...
-
void*型のデータサイズ
-
ポインタのポインタの初期化法
-
MSDNがgethostbynameではなくge...
-
callocの処理速度
-
free関数で動作が止まる
-
C++のnewで確保したメモリーの...
-
sprintf()の使い方について
-
Accessで、メモリを開放するタ...
おすすめ情報