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;
}