一、sizeof的概念
- sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。
- sizeof操作符以字节形式给出了其操作数的存储大小。
二、64位Linux系统中的sizeof
(指针跟自己的系统有关,32位系统是4个字节,64位是8个字节)
1、char : 1个字节(固定)
2、*(即指针变量): 8个字节
3、short int : 2个字节(固定)
4、int: 4个字节(固定)
5、unsigned int : 4个字节(固定)
6、float: 4个字节(固定)
7、double: 8个字节(固定)
8、long: 8个字节
9、unsigned long: 8个字节(变化*其实就是寻址控件的地址长度数值)
10、long long: 8个字节(固定)
三、联合、结构体的sizeof
1、联合union:sizeof是其最大字节成员的字节数
union u{
char c;
double d;
}u;
sizeof(u) = max(sizeof(c),sizeof(d)) = sizeof(1,8) = 8;
2、结构体struct:sizeof是其成员类型的总字节数,包括补充字节在内
struct a{
char b;
double x;
}a;
在Linux上: sizeof(a) = 12; 而一般sizeof(char) + sizeof(double) = 9;
这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。
但如果全对齐的话,sizeof(a) = 16, 这是因为b被放到偏移量为0的地址,占1个字节;在存放x时,double类型长度为8,需要放到能被8整除的偏移量上,这时候需要补7个空字节, 达到8个,这时候偏移量为8,放上x后长度为16。
在此例中,所有的结构成员都要放在被4整除的地址(Linux的存放方式),这里补3个字节,所以为12。
四、数组的sizeof
当操作数具有数组类型时,其结果是数组的总字节数。
char a[5];
int b[5];
sizeof(a) = 5;
sizeof(b) = 20;
五、其他
sizeof(8) = 4; //自动转化为int类型
sizeof(8.8) = 8; //自动转化为double类型,注意,不是float类型
sizeof("ab") = 3; //自动转化为数组类型,最后的'\0'符