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

C99 中的_Bool类型(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.

_Bool因此bool具有sizeof至少1,并且在我见过的大多数实现中,sizeof(bool)/sizeof(_Bool)1

如果你看一下 GCC's 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 和 GCC 4.7.0 都输出相同。正如 trinithis 指出的那样,sizeof(true)sizeof(false)产生更大的尺寸,因为它们采用 int 文字的大小,至少是sizeof(int).

于 2012-05-17T05:21:22.887 回答
3

C99标准介绍了_Bool类型。_Bool保证足够大以容纳整数常量 0 或 1 ,这并不一定意味着它是一个 int。实际大小取决于编译器。

于 2012-05-17T05:15:36.050 回答
2

我很确定它取决于您的编译器,也许您的编译器使用的是字节而不是 int 作为 bool?无论哪种方式,如果您使用 sizeof() 来知道要分配多少内存,您都不应该有内存分配问题,例如,如果您想分配 10 个布尔值的内存,请不要分配 10 * 4,执行 10 * sizeof (bool) 所以你不会出错。

于 2012-05-17T05:10:48.777 回答
1

正如我从将代码从 Windows 移植到 Unix 中所知道的那样,您永远无法确定数据类型的大小。它取决于操作系统,有时甚至取决于您使用的编译器。

stdbool.h 的规范只说 TRUE 和 FALSE 映射到一个整数(1 和 0)。这并不意味着数据类型 bool 是 int 类型。根据我的经验, bool 是可用的最小数据类型(即 char 或 byte):

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

在 eclipse CDT 和 Visual Studio 中,您可以按照宏定义来查看数据类型背后的真正含义。

所以我建议你总是向你的编译器询问分配足够内存所需的内存空间(这也是我在很多库中看到的):

malloc(4*sizeof(bool));

我希望这有帮助。

于 2012-05-17T06:33:38.707 回答
1

它是一个整数,但不是int. char, short, int, long,long long等都是整数。保证大小为 1。其余的至少与 char 一样大(如果不大于 char char,很难想象如何使 I/O 系统正常工作)。int还有一个从charto 到的必需顺序long long(与我在上面列出的顺序相同),其中每种类型的范围必须至少与其前辈一样多。

但是,除此之外,您不能保证整数类型的大小。具体来说,char它是唯一一种具有保证大小的“基本”类型(尽管有类似int8_tint32_t具有保证大小的类型)。

于 2012-05-17T05:26:45.417 回答
0

_Bool 是编译器原生的,在 C99 中定义,可以像这样激活gcc -std=c99;stdbool.h #define bool 为 _Bool,true 和 false 为简单的 int 字面量,非常适合该 _Bool。

于 2012-05-17T05:16:17.727 回答