sizeof是C语言中的一个运算符,特别说明的是sizeof的用法虽很像函数(sizeof()),但其只是个关键字。sizeof的作用是用来返回括号中()里卖弄的变量或者数据类型占用的内存字节数。
sizeof的价值
主要是因为在不同平台下各种数据类型所占的内存字节数可能存在差异(譬如在32系统中为4个字节,在16为系统中为2字节)。所以程序中需要使用sizeof来判断变量和某个数据类型在当前环节下占几个字节。
同时可以使用sizeof编写代码可以适配各个平台环境,感受下以下代码有何不同?
假如我们在编写代码中,想申请100个int类型的数据大小内存空间(以32位系统为例)
//写法一:int *p = malloc(4*100);//写法二:int *p1 = malloc(sizeof(int) * 100);
显然第一种写法在移植到其他平台上,就需要修改程序,而第二种完美适配。养成良好的编程习惯,提升编程能力,正是需要抓住这些细节。
以下也是一个sizeof典型的智能用法:
sizeof和strlen的区别
#include int main(void){char str[] = "hello"; printf("sizeof(str) = %d.", sizeof(str));printf("strlen(str) = %d.", strlen(str));return 0;}
运行结果:
从程序运行结果可知,sizeof计算str字符串长度时,会将编译器自动添加的字符串结束符('0')也计算进去,因此 'h', 'e', 'l', 'l' , 'o', '0', 总长度为6。而strlen则直接计算字符串实际有效长度,即计算长度不包含结束符'0', 因此结果为5。
sizeof测试指针变量大小
测试指针变量占用字节数(我的测试环境是64位的Ubuntu)
#include int main(void){char str[] = "hello"; char *p = str;short *p1; int *p2; long int *p3;printf("sizeof(p) = %d.", sizeof(p));//计算char *指针变量printf("sizeof(p1) = %d.", sizeof(p1));//计算short *指针变量printf("sizeof(p2) = %d.", sizeof(p2));//计算int *指针变量printf("sizeof(p3) = %d.", sizeof(p3));//计算long *指针变量return 0;}
运行结果:
可以看到,不管何种类型的指针变量,所占用的字节都是8个(64位系统,如果是32位系统,则结果为4), 因此我们可以得到指针变量,所占的字节数是跟系统位数相关的,与何种类型无关(如char *, int *, float *等等)