是关键字,在编译时计算出对象所占的字节数。
对象类型
0、变量
返回变量类型占用的字节大小。
1、表达式
char c = 1;
int i = 2;
printf("%ld,%ld\n",sizeof(c + i),sizeof(c = c + i));//4,1
前者c + i会隐式类型转化为int类型(类型提升),因此返回4(32/64位系统), 而后者虽然运算时也是转化为int,但赋值给c时又会转化为char,因此返回的是1,其中的表达式不会真正的执行。
2、函数
char FunSizeof()
printf("%ld\n", sizeof(FunSizeof()));//1
不会执行函数,只是判断了返回类型。
3、数组/指针
当sizeof的对象是数组时,返回数组总字节大小,而当对象是指针时,返回指针本身的大小,而不是指示内存空间的大小。因为指针本身就是一个无符号整型数, 因此int *p ,sizeof(p)返回的大小是sizeof(void *), 32 位系统返回4,即32位;64 位系统返回8,查看Linux系统位数命令:getconf LONG_BIT。
4、动态内存
sizeof 无法获取动态分配的内存大小,即使用malloc动态的分配内存,无法使用sizeof获取其大小,因为sizeof是在编译时就确定其值。
5、结构体
会根据内存字节对齐计算出占用字节大小。
扩展
sizeof(1.0)=8;1.0被认为是double类型,所以占用8字节;
sizeof('a');在C中等于4,在C++中等于1,为啥??
C99标准的规定,'a'叫做整型字符常量(integer character constant),被看成是int型,所以占4字节。
ISO C++标准规定,'a'叫做字符字面量(character literal),被看成是char型,所以占1字节。
sizeof("a")=2;这个是正常的,带结束符'\0';
sizeof(指针);在32位系统占4字节,在64位系统占8字节,其他类型变量在32货或64位系统没有差异。