一、sizeof 介绍
sizeof 是 C 语言中的一个运算符,用于计算数据类型或变量在内存中占用的字节数。用于计算数据类型或变量所占的内存大小,以字节为单位。它可以在编译时计算其操作数的大小,并返回一个 size_t 类型的值。它可以帮助了解不同类型的数据在内存中的布局,从而更有效地管理内存。
代码示例:
#include <stdio.h> int main(void)
{ int a = 10; float b = 5.75; char c = 'A'; double d = 9.99; printf("Size of int: %zu bytes\n", sizeof(int)); printf("Size of float: %zu bytes\n", sizeof(float)); printf("Size of char: %zu bytes\n", sizeof(char)); printf("Size of double: %zu bytes\n", sizeof(double)); printf("Size of variable a: %zu bytes\n", sizeof(a)); printf("Size of variable b: %zu bytes\n", sizeof(b)); printf("Size of variable c: %zu bytes\n", sizeof(c)); printf("Size of variable d: %zu bytes\n", sizeof(d)); // 使用表达式 printf("Size of expression a + b: %zu bytes\n", sizeof(a + b)); // 结果为 float 类型大小 return 0;
}
测试结果输出(可能因编译器和平台而异):
数组和结构体示例代码:
#include <stdio.h> struct Example
{ char c; int i; double d;
}; int main(void)
{ int arr[10]; struct Example ex; printf("Size of array arr: %zu bytes\n", sizeof(arr)); // 10 * sizeof(int) printf("Number of elements in array arr: %zu\n", sizeof(arr) / sizeof(arr[0])); printf("Size of struct Example: %zu bytes\n", sizeof(ex)); return 0;
}
示例运行结果:
注意事项:
1、编译时计算:sizeof 是在编译时计算的,而不是运行时。因此,它不会增加程序的运行时间开销。
2、类型大小:不同编译器和平台可能会因为对齐和填充的原因,导致相同类型的数据大小不同。例如,在 32 位系统上,int 通常是 4 字节,但在某些 16 位系统上可能是 2 字节。
3、数组大小:使用 sizeof 可以方便地计算数组的总大小。例如,sizeof(array) / sizeof(array[0]) 可以计算数组的元素个数。
4、结构体:对于结构体,sizeof 会计算所有成员的大小,并考虑对齐和填充。
二、sizeof计算数组名、 数组首地址、数组的元素
对于数组来说,sizeof 的使用有一些特殊的行为,特别是当它与数组的首地址和数组的第一个元素进行比较时。
2.1 sizeof 数组名
当对数组名使用 sizeof 操作符时,它会返回整个数组所占的内存大小。例如:
int arr[10];
printf("%d\n", sizeof(arr)); // 输出 40,假设 int 大小为 4 字节
在这个例子中,sizeof(arr) 返回的是整个数组 arr 的大小,即 10 * 4 = 40 字节。
2.2 sizeof 数组首地址(或数组名作为指针)
在C语言中,数组名在大多数表达式中为指向数组第一个元素的指针。当对数组名(作为指针)使用 sizeof 时,它实际上计算的是指针的大小,而不是数组的大小。例如:
int arr[10];
printf("%d\n", sizeof(&arr)); // 输出 指针大小,通常是 4 或 8 字节,取决于平台
printf("%d\n", sizeof(&arr[0])); // 同样输出 指针大小
在这个例子中,sizeof(&arr) 和 sizeof(&arr[0]) 都是计算指针的大小,而不是数组的大小。&arr 是指向整个数组的指针(类型为 int ( * )[10]),但在这里它作为 void * 或其他指针类型传递给 sizeof,所以结果是指针的大小。而 &arr[0] 是指向数组第一个元素的指针(类型为 int* ),结果同样是指针的大小。
2.3 sizeof 数组的某个元素
当对数组的某个元素使用 sizeof 时,它返回的是该元素的大小。例如:
int arr[10];
printf("%d\n", sizeof(arr[0])); // 输出 4,假设 int 大小为 4 字节
在这个例子中,sizeof(arr[0]) 返回的是数组第一个元素(也是第0个元素)的大小,即 4 字节。
测试代码:
#include <stdio.h>int main(void)
{static unsigned char pre_status[3]={0};printf("sizeof(pre_status)=%ld \n",sizeof(pre_status));printf("sizeof(&pre_status)=%ld \n",sizeof(&pre_status));printf("sizeof(&pre_status[0])=%ld \n",sizeof(&pre_status[0]));printf("sizeof(pre_status[0]=%ld \n",sizeof(pre_status[0]));printf("sizeof(pre_status)/sizeof(pre_status[0]) = %ld \n",sizeof(pre_status)/sizeof(pre_status[0]));return 0;
}
测试结果:
总结:
1、sizeof(数组名) 返回整个数组的大小。
2、sizeof(&数组名) 或 sizeof(&数组名[0]) 返回指针的大小。
3、sizeof(数组名[0]) 返回数组第一个元素的大小。