sizeof 用于计算一个变量或者类型所占用的空间大小,单位是字节。
目录
1、sizeof 的使用方法
语法:
- sizeof 变量名
- sizeof(变量名)
int main() {
int a = 10;
char b = 'x';
int arr[10] = { 1 , 2 , 3 };
printf("%d\n", sizeof a); // 4
printf("%d\n", sizeof(b)); // 1
printf("%d\n", sizeof(arr)); //40
/*
变量a是 int 类型,一个int类型占 4 个字节,所以占用空间大小是 4 字节
变量b是char类型,一个char类型占 1 个字节,所以占用空间大小是 1 字节
*/
return 0;
}
注意:数组arr的大小是10,相当于占了10个int类型的空间,你或许会认为,数组里只存了 3 个数,为什么占用空间大小不是 3*4 = 12 字节?
这个数组申请了10个位置,这10个位置就属于这个数组,跟数组里有多少内容没有任何关系,就好比买了3张电影票,电影院就有3个位置是自己的,你可以去一个人,也可以去三个人。
2、sizeof 的基本特性
下面大致总结了sizeof 的三个特性,其中两个已经在上面说过了
- sizeof 是操作符,不是函数
- sizeof 计算的是变量所占空间大小,跟这块空间使用了多少,没有关系
- sizeof 内部的表达式不参与运算(如下)
int main()
{
int a = 5;
short s = 3;
printf("字节大小:%d\n", sizeof(s = a + 2)); //2
printf("s的值:%d\n", s); //3
return 0;
看起来像是:a + 2 的值是int类型,赋值给变量 s 的时候,因为变量 s 是 short类型,会被截短,
因此最终计算的是 s 的大小。
就结果而言是没有问题的,sizeof 确实计算的是 变量s 所占的空间大小,但是这个过程并没有发生加法运算,加法运算被无视了
3、区分sizeof 和 strlen
(1) 语法角度
sizeof 是操作符,而strlen 是函数
(2) 使用角度
sizeof 计算的是变量或者类型所占用的的空间大小,而strlen计算的是 有效长度(也就是数组中元素的个数)
#include <stdio.h>
#include <string.h>
int main()
{
char arr[10] = { 1,2,3 };
printf("字节大小:%d\n", sizeof(arr)); //10
printf("数组有效长度:%d\n", strlen(arr)); //3
return 0;
}
注意:strlen函数遇到 '\0' 的时候,会停止计算元素个数。但是上述数组中并未看到 '\0',那是因为
数组会自动将剩余部分初始化为 '\0'
4、sizeof 计算数组大小的坑
如果将数组 arr 单独放在 sizeof 中,那么 sizeof(arr) 计算的就是整个数组的大小;
如果将数组 arr 以实参的形式传递给其他函数,那么 sizeof(arr) 计算的是数组首元素地址的大小
void test(char arr[]){
printf("%d\n", sizeof(arr)); //4/8 (32位环境下是4,64位环境下是8)
}
int main(){
char arr[10] = {0};
printf("%d\n", sizeof(arr)); //10
test(arr);
}