9

誰かが理由を説明できることを望んでいた

#include <stdbool.h>

printf("size of bool %d\n", sizeof(bool));
printf("size of int %d\n", sizeof(int));

に出力

size of bool 1
size of int 4

http://pubs.opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.htmlを確認しました。これは、boolが本質的に_Boolのマクロであり、trueまたはfalseに設定すると、実際には整数定数のマクロ。整数の場合、なぜ同じサイズではないのですか?

十分なメモリを割り当てていないプログラムをデバッグするのに時間がかかりすぎたので、質問しています。

4

6 に答える 6

16

_BoolC99のタイプ( typedef'ed to boolin stdbool.h)には標準で定義されたサイズはありませんが、C99標準のセクション6.2.5によると:

2 An object declared as type _Bool is large enough to store the values 0 and 1.

Cでは、(ビットフィールドを除く)最小のアドレス指定可能なオブジェクトは、charであり、これは少なくとも8ビット幅であり、sizeof(char)常に1です。

_Boolboolしたがって、sizeof少なくとも1のがあり、私が見たほとんどの実装では、sizeof(bool)/sizeof(_Bool)1です。

GCCを見ると、次のようになりstdbool.hます。

 #define bool    _Bool
 #if __STDC_VERSION__ < 199901L && __GNUC__ < 3
 typedef int _Bool;
 #endif

 #define false   0
 #define true    1

したがって、コンパイル時に古いバージョンのGCCと古いバージョンのC標準を使用する場合intは、_Bool型として使用します。

もちろん、興味深いことに、これをチェックしてください:

#include <stdio.h>
#include <stdbool.h>

int main() {
   printf("%zu\n", sizeof(_Bool));
   printf("%zu\n", sizeof(true));
   printf("%zu\n", sizeof(false));

}

出力:

λ > ./a.out 
1
4
4

GCC 4.2.4、Clang 3.0、およびGCC4.7.0はすべて同じ出力です。trinithisが指摘しているように、intリテラルのサイズ(少なくとも。)を使用しているため、より大きなサイズsizeof(true)を生成します。sizeof(false)sizeof(int)

于 2012-05-17T05:21:22.887 に答える
3

C99規格で_Boolタイプが導入されました。_Bool整数定数0または1を保持するのに十分な大きさであることが保証されていますが、これは必ずしもintであることを意味するわけではありません。実際のサイズはコンパイラによって異なります。

于 2012-05-17T05:15:36.050 に答える
2

私はそれがあなたのコンパイラに依存しているとかなり確信しています、おそらくあなたはboolのためにintの代わりにbyteを使用していますか?いずれにせよ、sizeof()を使用して割り当てるメモリの量を知る場合、メモリ割り当ての問題は発生しないはずです。たとえば、10ブール値のメモリを割り当てたい場合は、10 * 4、do 10*sizeofを割り当てないでください。 (ブール)だからあなたは間違って行くことはできません。

于 2012-05-17T05:10:48.777 に答える
1

整数ですが、ではありませんint。、、、、、charなどはすべて整数です。サイズは1であることが保証されています。残りは少なくともcharと同じ大きさです(charより大きくない場合にI / Oシステムを正しく機能させる方法を想像するのは難しいです)。からへの必須の順序(上記でリストしたのと同じ順序)もあり、各タイプには少なくとも前のタイプと同じ範囲が必要です。shortintlonglong longcharintcharlong long

ただし、それ以外は、整数型のサイズについてはあまり保証されていません。具体的にcharは、サイズが保証されている「ベース」タイプの1つだけです(ただし、のようなタイプint8_tint32_tサイズが保証されているタイプがあります)。

于 2012-05-17T05:26:45.417 に答える
1

私がWindowsからUnixにコードを移植することから知っているように、データ型のサイズについては決して確信が持てません。それはオペレーティングシステムに依存し、時には使用するコンパイラにも依存します。

stdbool.hの仕様では、TRUEとFALSEが整数(1と0)にマップされるとだけ述べられています。これは、データ型boolがint型であることを意味するものではありません。私の経験から、boolは利用可能な最小のデータ型(つまり、charまたはbyte)です。

bool flag = TRUE; -> byte flag = 0x01;

EclipseCDTおよびVisualStudioでは、マクロ定義に従って、データ型の背後にあるものを確認できます。

したがって、十分なメモリを割り当てるために必要なメモリスペースについて、常にコンパイラに問い合わせることをお勧めします(これは、多くのライブラリで見たものでもあります)。

malloc(4*sizeof(bool));

これがお役に立てば幸いです。

于 2012-05-17T06:33:38.707 に答える
0

_Boolはコンパイラにネイティブであり、C99で定義されており、gcc -std=c99;のようにアクティブ化できます。stdbool.h #define boolは_Boolであり、trueとfalseは、その_Boolに非常によく適合するリテラルを単純にintします。

于 2012-05-17T05:16:17.727 に答える