第一批复习总结-答案.md 3.7 KB

第一批复习总结 · 答案解析

⚠️ 做完 第一批复习总结.md 的全部 30 题后再翻开本文件对照。 每道题给答案 + 一句话解析,解析都指向对应主题页。


判断题(对/错 + 一句话理由)

  1. 。只有 main 自己改,无程序外上下文,加 volatile 无意义(可能反而阻碍优化)。→ 1.volatile
  2. int *const p 绑指针本身,*p 可改、p 不可改。→ 2.const
  3. 。static 局部在静态存储区,不是栈(static 改的是存储期)。→ 3.static / 10.内存分配方式
  4. extern int x = 5; 带初始化是定义,会分配内存(extern + 初始化 = 定义)。→ 4.extern
  5. PINT a, b; 展开成 int* a, b;,b 是 int(文本替换,* 只粘 a)。→ 5.define-vs-typedef
  6. 。传参退化成指针,sizeof 得指针大小(4/8),拿不到数组大小。→ 6.数组名-vs-指针 / 19.sizeof-vs-strlen
  7. 。p 是数组指针(指向 int[5] 的指针),不是数组(括号护 *)。→ 7.数组指针-vs-指针数组
  8. 。置 NULL 是防御习惯,防止之后再解引用失效内存(悬垂)。→ 9.野指针
  9. 。栈 LIFO 精确回收不碎片;只有堆碎片。→ 11.堆-vs-栈
  10. 。c@0、i@4(补3)、d@8,总大小补到 12(不是 9,最大对齐 4 的倍数)。→ 14.结构体对齐
  11. 。union 成员同地址,写一个覆盖其他,大小 = 最大成员。→ 15.struct-vs-union
  12. 。pack(1) 省空间但访问慢(对齐是拿空间换速度)。→ 14.结构体对齐
  13. 。小端低字节 0x44 存低地址,u.c = 0x44(不是 0x11)。→ 17.大小端
  14. 。volatile 管可见性,管不了 LOAD/ADD/STORE 被拆 → 丢更新。要原子/临界区。→ 21.原子操作
  15. 。inline 只是建议,编译器可拒绝(大、递归、取地址等)。→ 22.内联函数

填空题

  1. ~(1U << 3)REG &= ~(1U<<3);)——清零必须取反掩码。→ 18.位操作宏
  2. &(REG >> 4) & 1;)——右移再与 1 取一位。→ 18.位操作宏
  3. 4、3——sizeof 含 \0(编译期按类型),strlen 不含(运行期数到\0)。→ 19.sizeof-vs-strlen
  4. 4(32 位)/ 8(64 位)——指针大小跟平台字长。→ 6.数组名-vs-指针
  5. 4——a@0、b@2,总 4(对齐 2 的倍数)。→ 14.结构体对齐
  6. 小端——低字节 0x78 存低地址。→ 17.大小端
  7. 栈指针 SP / .data 初值 / .bss——启动流程五步。→ 13.程序分段
  8. 链接——undefined reference 是符号找不到,链接阶段报。→ 4.extern / 23.c-可执行程序
  9. .bss / Flash——零初值不存 Flash,省空间。→ 13.程序分段
  10. 大端 / 小端——网络字节序大端,x86 小端。→ 17.大小端

代码改错/判断

  1. 返回局部数组地址 → 悬垂指针(栈销毁后失效)。防:返回堆/静态/调用方传入的缓冲区。→ 9.野指针
  2. 不合法。字符串字面量在只读区,str[0]='H' 是未定义行为(运行时崩溃);const 让编译器编译期拦截。→ 2.const
  3. 有泄漏。第一个 malloc 的地址被覆盖,无法 free(指针覆盖前必须先 free)。→ 12.内存泄漏-碎片
  4. REG = (REG & ~(0xF << 4)) | ((newVal & 0xF) << 4);——先清后置:清 bit4~7(保留其他),新值限宽+搬到目标位。→ 18.位操作宏
  5. 未初始化野指针。p 未赋值就解引用。防:定义即初始化 char *p = NULL;(初始化三件套之一)。→ 9.野指针

错题 > 3 道:回到对应主题页重学第 5 步变体验证。