为三个文件写 Makefile

场景:一个三文件的小程序,每次都手敲一长串 gcc 命令,改了头文件还常常忘了重编某个文件。该让 make 来管了。 任务:在 ~/work/mk 写一个 Makefile:make 把三个 .c 编成 .o 再链接成 shapes,mak

开始练习 →

改了头文件却不重编

场景:一个项目的 Makefile 先是直接报错跑不起来;勉强能跑之后,改了 config.h 里的参数,make 却说 up to date,程序行为纹丝不动。 任务:只改 ~/work/mk2/Makefile(不改 .c / .h),

开始练习 →

少留的那一个字节

先 malloc(strlen(s)) 再 strcpy,问题出在【0】。

开始练习 →

ASan 发现越界时

用 -fsanitize=address 编出来的程序,运行中发现越界访问时会【0】。

开始练习 →

容量翻倍的数组

动态数组装满时用 realloc 把容量翻倍。补全后装入 1 到 10,输出 最终容量/元素之和。 (本题用 gcc -std=c11 -O0 编译。)

开始练习 →

平时不崩的内存越界

场景:一段处理字符串的代码跑了很久都没出事,但代码审查的人坚持说里面有越界。空口无凭,得让工具把它指出来。 任务:用 AddressSanitizer 编译运行 ~/work/mem/buf.c,找出越界并修好,交付的 ~/work/mem

开始练习 →

用计数分配器堵住泄漏

场景:一个统计单词的程序从来不释放内存,遇到结束标记时还直接 return 了。程序短还看不出来,放进长期运行的服务就是隐患。 任务:修好 ~/work/leak/words.c:读到 END 停止读入并照常输出统计;程序结束前释放申请过的

开始练习 →

崩溃时的调用栈

程序在 gdb 里段错误停下后,想看崩溃时一层层的调用栈,用命令【0】。

开始练习 →

让 gdb 认得行号

想让 gdb 显示出错的源码文件和行号,编译时要加【0】。

开始练习 →

查不到就跳过

lookup 查不到商品时返回 NULL。补全循环:查不到的订单计入「未知」并跳过,其余累加价格,输出 合计/未知。 (本题用 gcc -std=c11 -O0 编译。)

开始练习 →