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

相关推荐
小白学大数据10 分钟前
超简单:用 Python 让 Excel 飞起来:用 openpyxl 把重复报表整理交给脚本
开发语言·数据库·python·excel
旧梦952721 分钟前
Java SortedMap 接口详解:从入门到实战
java·开发语言
莫陌尛.24 分钟前
Java_this构造方法
java·开发语言
Persistent的粽子!1 小时前
C++:类与对象(二)
开发语言·c++
AOI小白新手上路1 小时前
江科协51单片机 7-2 LCD1602显示时钟实验
单片机·嵌入式硬件·51单片机
Dreams°1231 小时前
【Java后端+Vue前后端分离:内网正常、公网访问异常|5个高频经典踩坑完整复盘】
java·开发语言·vue.js
思麟呀1 小时前
嵌入式入门(一)宏观生态到首次烧录
c语言·嵌入式硬件
runningshark1 小时前
SC32L14GR8PJR
单片机·嵌入式硬件
智购科技无人售货机厂家1 小时前
2026自动售货机备用电池管理系统设计:从充放电保护到健康监测的工程实践~YH
大数据·linux·单片机·嵌入式硬件·微信
小雪崩1 小时前
嵌入式学习 day39:TCP并发服务器模型
linux·服务器·c语言·网络·学习·tcp/ip