99 · C 语言易错点速查

2026.09.27

考前 / 面试前 10 分钟看这张。用 Ctrl+F 搜关键词。

🚨 崩溃 / 内存类

  • [ ] 数组越界不报错,直接改到别人的内存 → 未定义行为
  • [ ] 指针未初始化 = 野指针,解引用必崩
  • [ ] malloc 后忘记 free → 内存泄漏
  • [ ] free 后继续用 / 重复 free → 崩溃
  • [ ] 局部变量不初始化是垃圾值(Java 会给 0,C 不会)
  • [ ] 字符串忘了 '\0' → 越界读到乱码
  • [ ] 返回局部数组/变量的地址 → 栈已失效

⚠️ 语法 / 逻辑类

  • [ ] =(赋值)和 ==(比较)写混
  • [ ] 整数除法 5 / 2 == 2,要 5 / 2.0 才有小数
  • [ ] scanf("%d", n) 忘了 &(数组名除外)
  • [ ] switch 忘了 break → 分支穿透
  • [ ] 函数里想改外部变量只传了值 → 改不动,要传指针
  • [ ] 带参宏不加括号:#define SQ(x) x*x → SQ(1+2) 出错
  • [ ] strcmp 返回 0 才是相等
  • [ ] 用 == 比较字符串 → 比的是地址,永远错
  • [ ] sizeof 数组在函数里失效(数组退化成指针)
  • [ ] while (!feof(fp)) 会多读一次

✅ 三条黄金习惯

  1. 指针必初始化,解引用前判空,free 后置 NULL。
  2. 每个可能失败的系统调用(malloc/fopen)立刻检查返回值。
  3. 编译开 -Wall -Wextra,把警告当错误看。

🔑 必背结论

  • a[i] ≡ *(a + i)
  • p->name ≡ (*p).name
  • 数组名 = 首元素地址
  • 函数参数一律值传递
  • int 大小平台相关,sizeof 实测
  • 字符串 = char[] + '\0'

关联

C语言-学习总览 · C语言-两天复习计划 · Java与C核心差异