技术支持 石家庄网站建设,wordpress后台菜单加入页面,网站开发的自适应,淄博网站建设找卓迅一、sizeof 介绍
sizeof 是 C 语言中的一个运算符#xff0c;用于计算数据类型或变量在内存中占用的字节数。用于计算数据类型或变量所占的内存大小#xff0c;以字节为单位。它可以在编译时计算其操作数的大小#xff0c;并返回一个 size_t 类型的值。它可以帮助了解不同类…一、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.hint 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]) 返回数组第一个元素的大小。