1 基本概念
sizeof是以字节的形式计算出操作数的存储空间的大小 ,一种单目运算符,并不是函数。
2 使用对象
sizeof的使用对象包括具体的数据类型或者变量;不能用于函数类型,不完全类型或位字段,因为不知道其存储空间大小。
3 使用场景
sizeof的返回结果类型是size_t, 在头文件中定义为: typedef unsigned int size_t
1、C正式规定字符类型为1字节。
sizeof(char) = 1;
sizeof(unsigned char) = 1;
sizeof(signed char) = 1;
2、C中没有具体规定,大小依赖于实现。
sizeof(int) = 4;
sizeof(unsigned int) = 4;
sizeof(short int) = 2;
sizeof(unsigned short) = 2;
sizeof(long int) = 4;
sizeof(unsigned long) = 4;
sizeof(float) = 4;
sizeof(double) = 8;
sizeof(long double) = 12;
3、当操作数是指针时
一般Unix/Linux的指针字节数为4。
例如: char *p; sizeof(p) = 4; sizeof(*p)=1; //*p取值为char类型
int *a = malloc(100); sizeof(a) = 4; sizeof(*a)=4;
4、当操作数具有数组类型时,其结果是数组的总字节数。
例如: char a[5];
int b[5];
sizeof(a) = 5;
sizeof(b) = 20;
5、当操作数是具体的字符串或者数值时,会根据具体的类型进行相应转化。
例如: sizeof(8) = 4; //自动转化为int类型
sizeof(8.8) = 8; //自动转化为double类型,注意,不是float类型
sizeof("ab") = 3 //自动转化为数组类型,注意加上了最后的'\n'符
6、当操作数是联合类型时,sizeof是其最大字节成员的字节数。
还是让我们拿例子来说话:
union u{ //对union来说
char c;
double d;
}u;
sizeof(u) = max(sizeof(c),sizeof(d)) = sizeof(1,8) = 8;
7、当操作数是结构类型时,sizeof是其成员类型的总字节数,包括补充字节在内。
struct a{ //对struct来说
char b;
double x;
}a;
四字节对其的情况下,sizeof(a) = 12;
八字节对其时,sizeof(a) = 16, 这是因为b被放到偏移量为0的地址,占1个字节;在存放x时,double类型长度为8,需要放到能被8整除的偏移量上,这时候需要补7个空字节。
4 与strlen区别
strlen是一个函数,用来计算字符串的长度,即元素个数,strlen只能用char *作为参数,不包括‘\0’结束符
举例:
1:
char s[10] = "12345";
int a = strlen(s);
int b = sizeof(s);
- a = 5,因为strlen计算的是字符串的实际长度;b = 10,sizeof计算的是数组分配的空间大小。
2:
char *s = "0123456789";
int i = sizeof(s);
int j = sizeof(*s);
int k = strlen(s);
- i = 4,因为sizeof获得的是一个指针的值所占的地址空间,占4个字节;
j = 1,这是因为 ss 为第一个字符 ‘0’ 所以占一个字节;
k = 10,这是因为strlen所获得的是此字符串的实际长度;
3:
char buffer[] = "Hello";
int m = strlen(buffer);
int n = sizeof(buffer);
- m = 5,这是因为strlen测量的是字符串的实际长度;
n = 6,’\0’也需要占用一个字节,5+1。
4:
char buf[]={'a','b','c','d','e','f'};
int m = strlen(buf);
int n = sizeof(buf);
- m=随机值,没有/0结束符,返回的值是一个不确定的值
n=6, 数组buf以单个元素赋值,没有/0结束符,所以所占空间的大小为6个字节。
[参考博文]
https://blog.youkuaiyun.com/Yelbosh/article/details/12656113
https://blog.youkuaiyun.com/M_joy666/article/details/80471230