sizeof
是 C/C++ 中的一个运算符,用来计算变量或数据类型所占的内存大小,单位是字节。其返回值是 size_t
类型,表示某种类型或对象的字节数。
用法:
-
计算基本数据类型的大小:
printf("Size of int: %zu bytes\\\\n", sizeof(int)); // 输出整型的大小 printf("Size of char: %zu bytes\\\\n", sizeof(char)); // 输出字符型的大小 printf("Size of float: %zu bytes\\\\n", sizeof(float)); // 输出浮点型的大小
-
计算变量的大小:
int a = 10; printf("Size of variable a: %zu bytes\\\\n", sizeof(a)); // 计算变量 a 所占的内存大小
-
计算数组的大小:
int arr[10]; printf("Size of array: %zu bytes\\\\n", sizeof(arr)); // 输出整个数组的大小 printf("Size of array element: %zu bytes\\\\n", sizeof(arr[0])); // 输出数组中一个元素的大小
-
计算结构体的大小:
struct Example { int a; double b; char c; }; printf("Size of struct Example: %zu bytes\\\\n", sizeof(struct Example)); // 计算结构体的大小
-
与指针的使用区别:
对于指针,
sizeof
返回的是指针本身的大小,而不是它所指向的内容的大小。例如,在 64 位系统中,指针通常占 8 字节。int *ptr; printf("Size of pointer: %zu bytes\\\\n", sizeof(ptr)); // 返回指针自身的大小 printf("Size of dereferenced pointer: %zu bytes\\\\n", sizeof(*ptr)); // 返回指针指向的变量的大小
sizeof
的特点:
- 编译期计算:
sizeof
是在编译时计算的,而不是运行时,这使得它非常高效。 - 不执行表达式:
sizeof
不会对其参数进行求值,它只关心类型或表达式的类型。比如sizeof(++x)
不会真正增加x
的值。
常见的错误用法:
-
在函数参数为数组时:
如果你将一个数组作为函数参数传递,它会被退化为指针。在这种情况下,使用
sizeof
来计算数组的大小将返回指针的大小,而不是数组的实际大小。void func(int arr[10]) { printf("Size of arr: %zu bytes\\\\n", sizeof(arr)); // 结果是指针的大小,而不是数组 }
总结
sizeof
可以用于数据类型、变量、数组、结构体等,返回它们在内存中的大小,单位是字节。- 它在编译期计算,运行时效率高。
- 注意当数组退化为指针时,
sizeof
返回的是指针的大小。