sizeof(p) = 4;
当操作数具有数组类型时,其结果是数组的总字节数。
例如: 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 //自动转化为数组类型,
//长度是4,不是3,因为加上了最后的'\n'符
//有资料说,会自动转化为指针类型(Linux为4)
//可能和操作系统与编译器有关系
当操作数是联合类型时,sizeof是其最大字节成员的字节数。
当操作数是结构类型时,sizeof是其成员类型的总字节数,包括补充字节在内。
还是让我们拿例子来说话:
union u{ //对union来说
char
c;
double
d;
}u;
sizeof(u)
= max(sizeof(c),sizeof(d)) = sizeof(1,8) = 8;
struct a{ //对struct来说
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。