如果bool是int的宏,为什么它的大小不同?

时间:2012-05-17 05:01:50

标签: c memory int boolean

我希望有人可以解释原因

#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时,它实际上只是一个整数常量的宏。如果它是一个整数,为什么它的大小不一样?

我问,因为我们花了很长时间来调试我们没有分配足够内存的程序。

6 个答案:

答案 0 :(得分:12)

C99中的_Bool类型(typedef'bool中的stdbool.h编辑后没有标准的定义大小,但根据6.2.5的规定C99标准:

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

在C中,最小的可寻址对象(除了位域)是char,它至少是8位宽,sizeof(char)始终是1

因此,

_Boolbool的{​​{1}}至少为sizeof,在我见过的大多数实现中,1 / {{1是} sizeof(bool)

如果你看看GCC的sizeof(_Bool),你会得到这个:

1

因此,如果在编译时使用较旧版本的GCC和旧版C标准,则会将stdbool.h用作 #define bool _Bool #if __STDC_VERSION__ < 199901L && __GNUC__ < 3 typedef int _Bool; #endif #define false 0 #define true 1 类型。

当然,作为一件有趣的事情,请查看:

int

输出:

_Bool

GCC 4.2.4,Clang 3.0和GCC 4.7.0都输出相同。正如trinithis指出的那样,#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 会产生更大的尺寸,因为它们的尺寸是int文字,至少为sizeof(true)

答案 1 :(得分:2)

我很确定它依赖于你的编译器,也许你的bool使用的是byte而不是int?无论哪种方式,如果你使用sizeof()知道要分配多少内存,你不应该有内存分配问题,例如,如果你想分配10个bool值的内存,不要分配10 * 4,做10 * sizeof (布尔)这样你就不会出错。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

然而,除此之外,您不能保证整数类型的大小。具体来说,char是唯一具有保证大小的“基础”类型(尽管有int8_tint32_t等类型具有保证的大小。)

答案 4 :(得分: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));

我希望这会有所帮助。

答案 5 :(得分:0)

_Bool是编译器的原生,在C99中定义,可能像gcc -std=c99一样被激活; stdbool.h #define bool是_Bool,而true和false只是简单的int文字,非常适合_Bool。