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

相关推荐
qq_448011167 小时前
C语言中的动态内存分配
c语言·开发语言·php
FakeOccupational8 小时前
【电路笔记 STM32】Cortex-M7 内核上的数据缓存(D-Cache)结构+MPU+DMA&Cache+STM32CubeMX配置
笔记·stm32·缓存
动词ing8 小时前
【学习笔记】C语言(数组指针与指针数组+字符数组+函数+参数传递+字符串作为形参+递归函数+指针函数+回调函数+结构体嵌套+内存动态分配函数)
c语言·笔记·学习
汉字萌萌哒8 小时前
2024CSP-J入门级C++真题详解
开发语言·c++
arbboter8 小时前
【网络工具】NetProxy网络代理用户手册
开发语言·网络·c#·网络代理·网络异常·代理工具
殷忆枫8 小时前
基于K210与STM32的智能垃圾分类与物联网监管系统
stm32·物联网·分类
周洲08309 小时前
STM32 GPIO 外部中断深度解析:边沿触发 / 电平触发、NVIC 优先级配置、中断嵌套实战
stm32·单片机·嵌入式硬件
汉字萌萌哒9 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
叠层归一研究院9 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
LCG元9 小时前
STM32F103 CAN 总线通信实战:标准库双机通信与过滤器配置精讲
stm32·单片机·嵌入式硬件