# 第一批 C 语言八股 · 复习总结(23 主题) > 使用说明:先自测「判别规则速查表」,遮住右列自答;再做「综合练习题」,最后对答案。 > 面试前只翻本目录,不背题。 --- ## 一、判别规则速查表(遮右自测) | # | 主题 | 一句话判别规则 | | --- | -------------------- | --------------------------------------------------------------------------------- | | 1 | volatile | 变量被**程序控制之外的上下文**(中断/硬件/线程)改 → 加;否则不加 | | 2 | const | const**绑定左边最近的类型/`*`**;最左则绑右边。绑谁谁只读 | | 3 | static | 加在局部 → 改**存储期**(程序期);加在全局/函数 → 改**链接性**(锁文件内) | | 4 | extern | 一个文件定义 + 其他文件`extern` 声明;`extern + 初始化 = 定义` | | 5 | define vs typedef | define = 文本替换(无类型);typedef = 编译期真类型(有检查) | | 6 | 数组名 vs 指针 | sizeof/&a 里是数组(整块);传参/运算/赋值退化`&a[0]` | | 7 | 数组指针 vs 指针数组 | 无括号`int *p[N]` → `[]` 优先 = 指针数组;括号 `int (*p)[N]` = 数组指针 | | 8 | 函数指针 vs 指针函数 | 无括号`int *f(int)` = 返回指针的函数;括号 `int (*f)(int)` = 函数指针 | | 9 | 野指针 | 未初始化 / 悬垂 / 越界 = 野;防 = 初始化 + 置 NULL + 查界 | | 10 | 内存分配方式 | 全局/static→静态区(系统收);局部→栈(系统收);malloc→堆(程序员收) | | 11 | 堆 vs 栈 | 栈 LIFO 精确回收 → 快/小/无碎片/系统管;堆随机存取 → 慢/大/碎片/程序员管 | | 12 | 泄漏/碎片 | 该还没还 = 泄漏(总量少);还了不齐 = 碎片(总量够不连续) | | 13 | 程序分段 | 指令→text;const→rodata;非零初值→data;零/未初始化→bss;局部→栈;malloc→堆 | | 14 | 结构体对齐 | 成员偏移 = 自身对齐值整数倍;总大小 = 最大对齐值整数倍 | | 15 | struct vs union | struct 累加(各自独立);union 共用(大小 = 最大成员,写一个覆盖其他) | | 16 | 位域 | 按分配单元分块(int 4 字节);坑 = 可移植差、不能取地址、赋值截断 | | 17 | 大小端 | 高字节存低地址 = 大端;低字节存低地址 = 小端;通信先转网络序(大端) | | 18 | 位操作宏 | 置位`\|=`、清零 `&=~`、翻转 `^=`、取值 `>> & 1`;掩码 `1U< 或放 1、与非放 0、异或翻转、移位读位。掩码统一 `1U<> 4) ____ 1;`答:& 18. `char s[] = "abc";` → `sizeof(s)` = ____,`strlen(s)` = ____。答:4, 3 19. 32 位平台 `sizeof(int*)` = ____。答:4 20. 结构体对齐:`struct { char a; short b; }` → sizeof = ____(32 位平台)。答:4 21. 判断平台大小端:`int i = 0x12345678; char *p = (char*)&i;` 若 `*p == 0x78` 是 ____ 端。答:小 22. 程序启动流程:上电 → 复位向量 → 设 ____ → 拷 ____ 到 RAM → 清 ____ → 跳 main()。答:SP 栈顶指针, .data, .bss 23. `undefined reference` 报错发生在 ____ 阶段。答:连接 24. 未初始化全局变量进 ____ 段,不占 ____。答:.bss, flash 25. 网络字节序是 ____ 端,本机 x86 是 ____ 端。答:大,小 ### 代码改错/判断 26. 找出错误:`void f() { int arr[10]; return arr; }`答:返回已被销毁的指针,发生悬垂 27. 判断:`const char *str = "hi"; str[0] = 'H';` 合法吗?为什么?答:不合法,这是一个被 const 修饰的字面量,不允许修改 28. 判断:`int *p = malloc(100); p = malloc(200);` 有内存泄漏吗?答:内存泄露 29. 写出替换 bit4~bit7 为 newVal 的表达式。(oldVal & ~(0xf << 4)) | ((newVal & 0xf) << 4) 30. 判断:`char *p; p[0] = 5;` 属于哪类野指针?怎么防?答:未初始化, 将其初始化之后,再进行赋值 --- ## 四、答案(已分离) 答案解析已单独存放,避免自测时不小心看到答案: > **`第一批复习总结-答案.md`**(同目录)——完成全部 30 题后再翻开对照。 --- _复习目标:每条规则能自己讲出"为什么",不只记住结论。_