printf("int 大小: %zu\n", sizeof(int)); // 通常为4字节(32/64位系统)
printf("char 大小: %zu\n", sizeof(char)); // 固定为1字节
printf("double 大小: %zu\n", sizeof(double)); // 通常为8字节
int a = 10;
double b;
printf("变量a的大小: %zu\n", sizeof(a)); // 等价于 sizeof(int)
printf("变量b的大小: %zu\n", sizeof b); // 括号可省略(仅对变量)
计算整个数组的总字节数:
int arr[10];
printf("数组总大小: %zu\n", sizeof(arr)); // 10 * sizeof(int)
计算数组元素个数:
int len = sizeof(arr) / sizeof(arr[0]); // 10
指针的大小与指向的数据类型无关,仅取决于系统架构:
int *p;
char *str;
printf("指针p的大小: %zu\n", sizeof(p)); // 32位系统为4字节,64位系统为8字节
printf("指针str的大小: %zu\n", sizeof(str)); // 同上
结构体的大小可能因内存对齐规则而大于成员大小的简单相加:
struct Example {
char c; // 1字节(对齐到4字节)
int i; // 4字节
double d; // 8字节
};
printf("结构体大小: %zu\n", sizeof(struct Example));
// 输出可能是 1 + 3(填充) +4 +8 = 16字节(对齐到8字节边界)
sizeof 无法直接获取动态分配内存的大小:
int *p = malloc(10 * sizeof(int));
printf("p的大小: %zu\n", sizeof(p)); // 输出指针的大小(如8字节),而非分配的内存大小!
计算表达式结果类型的字节数(表达式不会被执行):
int x = 0;
printf("表达式大小: %zu\n", sizeof(x + 3.14)); // 等价于 sizeof(double)
char str[] = "hello";
printf("sizeof(str): %zu\n", sizeof(str)); // 输出6(5字符 + \0)
printf("strlen(str): %zu\n", strlen(str)); // 输出5
C99支持变长数组,此时 sizeof 的结果在运行时计算:
int n = 10;
int vla[n];
printf("VLA大小: %zu\n", sizeof(vla)); // 输出10 * sizeof(int)
类型转换:
sizeof 的结果类型是 size_t(无符号整数),打印时使用 %zu:
printf("size_t大小: %zu\n", sizeof(size_t)); // 通常为8(64位系统)
void func(int arr[]) {
// arr 退化为指针!
printf("函数内数组大小: %zu\n", sizeof(arr)); // 输出指针大小(如8字节)
}
int main() {
int arr[10];
printf("main中数组大小: %zu\n", sizeof(arr)); // 输出40(假设int为4字节)
func(arr);
}
struct A {
char a; // 1字节
int b; // 4字节(对齐到4字节边界)
short c; // 2字节(对齐到2字节边界)
};
// 总大小:1 + 3(填充) +4 +2 +2(填充) = 12字节(对齐到4字节)
printf("struct A大小: %zu\n", sizeof(struct A));
总结
用法 | 示例 | 说明 |
---|---|---|
基本类型大小 | sizeof(int) | 返回类型的字节数 |
变量大小 | sizeof(a) | 等价于变量类型的 sizeof |
数组总大小 | sizeof(arr) | 数组元素个数 × 单个元素大小 |
指针大小 | sizeof(int*) | 取决于系统架构(4或8字节) |
结构体大小 | sizeof(struct Example) | 考虑内存对齐规则 |
合理使用 sizeof 可以避免硬编码数据类型大小,增强代码的可移植性。