Nic*_*ckO 6 c memory int boolean
我希望有人可以解释原因
#include <stdbool.h>
printf("size of bool %d\n", sizeof(bool));
printf("size of int %d\n", sizeof(int));
Run Code Online (Sandbox Code Playgroud)
输出到
size of bool 1
size of int 4
Run Code Online (Sandbox Code Playgroud)
我已经看了http://pubs.opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html这似乎表明,布尔本质上是_Bool宏,当设置为true或false,其实只是一个整数常量的宏.如果是整数,为什么它的大小不一样?
我问,因为我们花了太长时间来调试我们没有分配足够内存的程序.
wkl*_*wkl 12
_Bool
C99中的类型(typedef
'ed to bool
in stdbool.h
)没有标准的定义尺寸,但根据C99标准的6.2.5节:
2 An object declared as type _Bool is large enough to store the values 0 and 1.
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
因此,如果在编译时使用旧版本的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));
}
Run Code Online (Sandbox Code Playgroud)
输出:
? > ./a.out
1
4
4
Run Code Online (Sandbox Code Playgroud)
GCC 4.2.4,Clang 3.0和GCC 4.7.0都输出相同.正如trinithis指出的那样,sizeof(true)
并且sizeof(false)
产生更大的尺寸,因为它们正在采用int字面的大小,这至少是这样sizeof(int)
.