99 · C 语言易错点速查
考前 / 面试前 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))会多读一次
✅ 三条黄金习惯
- 指针必初始化,解引用前判空,free 后置 NULL。
- 每个可能失败的系统调用(malloc/fopen)立刻检查返回值。
- 编译开
-Wall -Wextra,把警告当错误看。
🔑 必背结论
a[i]≡*(a + i)p->name≡(*p).name- 数组名 = 首元素地址
- 函数参数一律值传递
int大小平台相关,sizeof实测- 字符串 =
char[]+'\0'
关联
C语言-学习总览 · C语言-两天复习计划 · Java与C核心差异