21. 嵌入式面试避坑指南:sizeof 是关键字,不是函数!

理解 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 误用导致的内存计算错误。

相关推荐
晓蛋2 天前
c语言指的是什么意思
c语言·编译器·编程开发·集成开发环境·程序实例
不悔哥2 天前
开源OV-Watch:怎么做一个智能手表
单片机·开源·嵌入式
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
傲世仙尊2 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
XiHongShi20162 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
牵猫散步的鱼儿2 天前
重载、重写(覆盖)、重定义区别
c语言
伞伞悦读2 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
phltxy3 天前
C 语言指针:从内存地址到灵活的数据访问
c语言
优信电子3 天前
AIT1001 非接触式红外测温模块 STM32 驱动开发实战:从引脚到代码全解析
stm32·嵌入式·温度传感器·红外测温·非接触式测温·ait1001
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++