1、对于静态数组(静态分配的数组)
当使用 sizeof
来获取一个静态数组的大小时,它会返回该数组的总字节数(即数组元素的字节数 *
元素个数)。可以在编译时计算出来,因此对于静态数组,sizeof
的返回值是确定的。
#include <stdio.h> int main() { int array[10]; // 静态数组,包含 10 个整数 printf("Size of array: %zu\n", sizeof(array)); // 返回数组的字节数 return 0; }
2、对于指针(动态分配的数组)
当用 sizeof
获取一个指针的大小时,返回的是指针本身的大小,而不是它所指向的内存块的大小。指针的大小取决于平台(在 32 位系统上通常是 4
字节,在 64
位系统上通常是 8
字节)。
#include <stdio.h> int main() { int *array = malloc(10 * sizeof(int)); // 动态分配内存,包含 10 个整数 printf("Size of array pointer: %zu\n", sizeof(array)); // 返回指针的字节数 free(array); // 释放内存 return 0; }
3、sizeof 在函数中的行为
如果数组作为参数传递到函数中,sizeof
不再返回数组的大小,而是返回指针的大小。因为在函数中,数组会退化为指针。
#include <stdio.h> void print_size(int *array) { printf("Size of array in function: %zu\n", sizeof(array)); // 返回指针的大小 } int main() { int array[10]; print_size(array); // 传递数组作为参数 return 0; }
4、sizeof 操作符的使用
sizeof
操作符用于获取数据类型或数据对象的大小(以字节为单位)。它在编译时确定大小,因此不会引入运行时开销。
#include <stdio.h> int main() { // 数据类型大小 printf("Size of char: %zu bytes\n", sizeof(char)); printf("Size of int: %zu bytes\n", sizeof(int)); printf("Size of float: %zu bytes\n", sizeof(float)); printf("Size of double: %zu bytes\n", sizeof(double)); // 变量大小 int a = 10; double b = 3.14; printf("Size of variable a: %zu bytes\n", sizeof(a)); printf("Size of variable b: %zu bytes\n", sizeof(b)); // 数组大小 int arr[5]; printf("Size of array arr: %zu bytes\n", sizeof(arr)); printf("Size of one element in arr: %zu bytes\n", sizeof(arr[0])); // 指针大小 int *ptr = &a; printf("Size of pointer ptr: %zu bytes\n", sizeof(ptr)); // 结构体大小 struct Person { char name[50]; int age; }; struct Person person; printf("Size of struct Person: %zu bytes\n", sizeof(struct Person)); return 0; }