理解 sizeof 的本质
sizeof 是 C/C++ 中的关键字,用于在编译时计算数据类型或变量占用的字节数。其行为与函数不同,不会对括号内的表达式求值,仅分析类型信息。
验证示例
c
int a = 10;
size_t size = sizeof(a++); // a++ 不会执行
printf("Size: %zu, a: %d\n", size, a); // 输出 Size: 4, a: 10
常见使用场景
基本类型与变量
c
sizeof(int); // 4(假设 int 为 4 字节)
char c;
sizeof(c); // 1
数组
计算整个数组的字节大小:
c
int arr[5];
sizeof(arr); // 5 * sizeof(int) = 20
陷阱:数组作为函数参数时退化为指针:
c
void func(int arr[]) {
sizeof(arr); // 输出指针大小(如 8 字节)
}
结构体与内存对齐
结构体大小受对齐规则影响:
c
struct Example {
char a; // 1 字节
int b; // 4 字节
};
sizeof(struct Example); // 可能为 8(补齐 3 字节)
指针相关行为
c
int* ptr;
sizeof(ptr); // 指针大小(通常 4 或 8 字节)
sizeof(*ptr); // sizeof(int) = 4
数组指针辨析
c
int arr[3][4];
sizeof(arr[0]); // 16(4 * sizeof(int))
sizeof(arr[0] + 1); // 8(指针运算后仍为指针)
面试题解析
题目:以下代码的输出是什么?
c
int a[] = {1, 2, (3, 4)}; // 逗号表达式结果为 4
printf("%zu\n", sizeof(a)); // 12(3 * 4)
printf("%zu\n", sizeof(&a)); // 8(指针大小)
printf("%zu\n", sizeof(*a)); // 4(a[0] 是 int)
关键点
- 逗号表达式
(3, 4)的值为最后一个操作数4。 &a是数组地址,类型为int(*)[3],但sizeof仅关心指针大小。
避坑总结
- 编译时行为 :
sizeof在编译期确定结果,不执行表达式。 - 数组退化 :函数参数中数组会退化为指针,导致
sizeof结果变化。 - 内存对齐 :结构体的
sizeof可能大于成员总和。
通过理解这些规则,可避免嵌入式开发中因 sizeof 误用导致的内存计算错误。