sizeof 是 C 语言的运算符 (不是函数),核心作用是:计算一个数据 / 类型在内存中占用的字节数 ,结果是 size_t 类型(无符号整数)。
它的用法非常固定,只有两种标准形式,所有场景都适用。
一、两种基本用法
1. 计算【数据类型】的大小
格式:sizeof(类型名)适用于:int、char、float、double、结构体、指针等所有 C 语言数据类型。
#include <stdio.h>
int main() {
// 32/64位系统常见大小(单位:字节)
printf("char: %zu\n", sizeof(char)); // 1
printf("int: %zu\n", sizeof(int)); // 4
printf("float: %zu\n", sizeof(float)); // 4
printf("double: %zu\n", sizeof(double)); // 8
return 0;
}
✅ 注意:类型名必须加括号 ,不能写成 sizeof int。
2. 计算【变量 / 数组 / 表达式】的大小
格式:sizeof 变量名 或 sizeof(变量名)括号可以省略,两种写法完全等价。
#include <stdio.h>
int main() {
int a = 10;
double b = 3.14;
// 两种写法都正确
printf("a: %zu\n", sizeof a); // 4
printf("b: %zu\n", sizeof(b)); // 8
return 0;
}
二、高频实用场景(必学)
场景 1:计算数组长度
这是 sizeof 最常用的功能!公式:数组总字节数 ÷ 单个元素字节数 = 元素个数
#include <stdio.h>
int main() {
int arr[] = {1,2,3,4,5};
// 总大小:5个int ×4 =20字节
// 单个元素大小:sizeof(int)=4
int len = sizeof(arr) / sizeof(arr[0]);
printf("数组长度:%d\n", len); // 输出 5
return 0;
}
⚠️ 坑点:数组作为函数参数传递时,sizeof 会失效(退化为指针)。
场景 2:计算字符串长度(区分 strlen)
-
sizeof:算内存占用 (包含字符串末尾的\0) -
strlen:算有效字符数 (不包含\0)#include <stdio.h>
#include <string.h>
int main() {
char str[] = "hello";
printf("sizeof: %zu\n", sizeof(str)); // 6(h e l l o \0)
printf("strlen: %zu\n", strlen(str)); // 5(仅有效字符)
return 0;
}
场景 3:计算结构体大小
会自动计算内存对齐后的总字节数:
#include <stdio.h>
struct Student {
int id; // 4
char name; // 1
};
int main() {
printf("%zu", sizeof(struct Student)); // 8(内存对齐)
return 0;
}
三、核心特性(必记)
-
编译期计算 :程序运行前就确定结果,不执行括号内的代码
int a = 10; sizeof(a++); // a 不会自增!sizeof 不执行表达式 -
结果是无符号数 :打印必须用
%zu格式化输出(C99 标准) -
指针大小固定 :32 位系统指针占 4 字节,64 位系统占 8 字节
int *p; printf("%zu", sizeof(p)); // 4(32位) / 8(64位)
四、常见错误
- ❌
sizeof int→ 错误(类型必须加括号) - ❌ 用 sizeof 计算函数参数数组长度 → 错误(退化为指针)
- ❌ 用
%d打印 sizeof 结果 → 不规范(建议用%zu)
总结
- 算类型 :
sizeof(类型)→ 必须加括号 - 算变量 :
sizeof 变量/sizeof(变量)→ 括号可选 - 核心用途:求数组长度、分配内存、计算结构体大小
- 不执行表达式,编译期确定大小