如果bool是int的宏,为什么它的大小不同?
我希望有人可以解释原因
#include 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时,它真的只是一个整数常量的宏。 如果是整数,为什么它的大小不一样?
我问,因为我们花了太长时间来调试我们没有分配足够内存的程序。
C99中的_Bool
类型(在stdbool.h
中为stdbool.h
to bool
)没有标准的定义大小,但是根据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的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 #include 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 literal的大小,至少是sizeof(int)
。
C99标准引入了_Bool
类型。 保证_Bool
足够大以容纳整数常量0或1,这并不一定意味着它是一个int。 实际大小取决于编译器。
我很确定它依赖于你的编译器,也许你的bool使用byte而不是int? 无论哪种方式,如果你使用sizeof()知道要分配多少内存,你不应该有内存分配问题,例如,如果你想分配10个bool值的内存,不要分配10 * 4,做10 * sizeof (布尔)这样你就不会出错。
它是一个整数,但不是int
。 char
, short
, int
, long
, long long
等等都是整数。 char
保证大小为1.其余的至少与char一样大(如果int
不大于char,很难想象如何使I / O系统正常工作)。 还有从char
到long long
的必需订单(我在上面列出了相同的订单),其中每种类型必须至少具有与其前辈一样多的范围。
但是,除此之外,您无法保证整数类型的大小。 具体来说, char
是唯一具有保证大小的“基本”类型(尽管有类似int8_t
和int32_t
类型具有保证大小)。
正如我所知道的,从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));
我希望这有帮助。
_Bool是编译器的原生,在C99中定义,可以像gcc -std=c99
一样激活; stdbool.h #define bool是_Bool,而true和false只是简单的int文字,非常适合_Bool。