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

相关推荐
女神下凡9 分钟前
芯参谋(85):Linux_PPI_NAND_驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件·设计规范
旖旎夜光34 分钟前
【C++ 基础入门】命名空间、输入输出、缺省参数与函数重载
开发语言·c++·笔记·学习
俩个逗号。。1 小时前
Kotlin flow 详解
android·开发语言·kotlin
Zw-awa1 小时前
从 CH340 到 HC-05 和 HC-06:让小车脱离电脑
stm32
程序猿乐锅2 小时前
万字详解Single-flight(单飞模式)
java·开发语言·分布式·后端·学习·single-flight
硅基手札2 小时前
【Linux 内核专栏 19】20 · 嵌入式子系统 — GPIO·pinctrl·clock·regulator
linux·运维·单片机·linux内核·嵌入式开发·调试定位
揽星河..3 小时前
【C语言】指针
c语言·开发语言
小小数媒成员3 小时前
UGUI原理(一)
开发语言·游戏·unity·游戏引擎
速易达网络4 小时前
Three.js 动画入门教学:从场景搭建到流畅动效
开发语言·javascript·ecmascript
福大大架构师每日一题4 小时前
excelize v2.11.1发布:Go 1.26.0起步,16项安全修复与嵌入对象能力全面升级
开发语言·安全·golang