C语言 sizeof 运算符速查
本质
- 编译时运算符(非函数),编译阶段求值,零运行时开销
- 返回
size_t类型(无符号整数),表示字节数
语法
c
sizeof(类型/变量/表达式) // 带括号(通用)
sizeof 变量 // 仅变量可省略括号
典型大小(64位系统)
| 类型 | 字节数 |
|---|---|
char |
1(标准保证) |
short |
2 |
int |
4 |
long |
8 |
long long |
8 |
float |
4 |
double |
8 |
| 指针 | 8 |
四大应用场景
1. 动态内存分配
c
int *arr = malloc(10 * sizeof(*arr)); // 推荐写法
2. 数组元素计数
c
size_t n = sizeof(arr) / sizeof(arr[0]);
// ⚠️ 数组退化为指针后失效
3. 结构体对齐分析
c
// sizeof 包含填充字节,≠ 成员大小之和
struct { char a; int b; char c; }; // 12 字节,非 6
4. 缓冲区声明
c
char buf[sizeof(struct my_struct)];
关键特性
| 特性 | 说明 |
|---|---|
| 编译时求值 | 表达式不会被执行 |
| VLA 例外 | 可变长度数组运行时求值 |
| 限制 | 不能用于 void、函数类型、不完整类型 |
常见陷阱
- ❌ 函数内数组参数退化为指针
- ❌
sizeof(指针)≠sizeof(指向类型) - ❌ 结构体含填充字节
- ❌
size_t与有符号数混用
核心要点
sizeof 是理解 C 语言内存模型和类型系统的基础工具