在C语言中,sizeof 运算符用于确定任何数据类型或对象在内存中占用的字节数。这个运算符在编译时被求值,所以它的结果是一个编译时常量,这意味着它可以用在任何需要常量表达式的地方,比如数组的大小。
使用 sizeof 的方式:
- 获取数据类型的大小:可以用 sizeof 来获取基本数据类型(如 int、float、char 等)或结构体、联合等复合数据类型的大小。
size_t size = sizeof(int);
- 获取数组的大小:用 sizeof 来获取整个数组的大小(以字节为单位),或者数组中单个元素的大小。
int arr[10];
size_t arrSize = sizeof(arr); // 获取整个数组的大小
size_t elemSize = sizeof(arr[0]); // 获取数组单个元素的大小
- 获取指针类型的大小:当用于指针时,sizeof 返回指针本身的大小,而不是指针指向的数据的大小。
int *ptr;
size_t ptrSize = sizeof(ptr); // 获取指针的大小,而不是指针指向的数据的大小
举例
#include <stdio.h>
int main() {
int intVar;
float floatVar;
char charVar;
printf("Size of int: %zu bytes\n", sizeof(intVar));
printf("Size of float: %zu bytes\n", sizeof(floatVar));
printf("Size of char: %zu byte\n", sizeof(charVar));
int arr[20];
printf("Size of int array with 20 elements: %zu bytes\n", sizeof(arr));
printf("Size of one element of int array: %zu bytes\n", sizeof(arr[0]));
return 0;
}
注
类型和表达式:sizeof 可以接受一个类型,如 sizeof(int),也可以接受一个表达式,如 sizeof(x)。当用于表达式时,表达式不会被实际求值。sizeof(类型)时括号可以去掉,但是 sizeof(变量)时也可以去掉括号。
指针大小:sizeof 用于指针时,它给出的是指针本身的大小,而不是指针所指向的数据的大小。在大多数现代架构上,无论指针类型如何,指针的大小通常都是固定的(例如,在64位系统上通常是8字节)。
数组和指针的区别:对于数组,sizeof 返回整个数组的大小;而对于指针,它返回指针本身的大小。这一点在处理动态分配的数组(即通过指针访问的数组)时尤为重要。
结构体和填充:使用 sizeof 获取结构体大小时,结果可能包含了因对齐要求而引入的填充字节。
返回类型:sizeof 返回 size_t 类型的值,这是一个无符号整型,定义在 <stddef.h> 中。
常量表达式:由于 sizeof 在编译时求值,它产生的是常量表达式。这意味着可以用 sizeof 来定义数组的大小或者作为 case 语句的标签等。