2026.06.17 – 2026.07.14 · 有效学习 18 天 · 从 malloc 是什么都不知道到多文件编译 + Makefile
#
目录
项目
一句话
1
2026-06-22
GK1 · 学生成绩管理器 v1
单科成绩排序 + 文件读写—第一个完整 C 项目
2
2026-06-25
C1 · 学生成绩管理器 v2
三科成绩 + 嵌套动态数组 + 文件持久化—踩坑最密集的阶段
3
2026-07-13
GK2 · 中缀计算器(单文件)
双栈协作调度场算法—30 分钟跑通,方法论奏效
4
2026-07-14
C 收官 · 中缀计算器(多文件)
工程化拆分 + 头文件守卫 + Makefile—C 阶段收尾
timeline
title C 语言学习进展
6.17
: malloc / free / realloc
: 结构体
: 文件读写
: 指针与数组
7.13
: 双栈协作
: 调度场算法
: assert 守卫
: 纸笔推演
: 从零画版本到 30 分钟改代码
7.14
: 多文件编译
: 头文件守卫
: Makefile
: 模块化设计
: make clean && make
Loading
方法论
什么时候建立的
一句话
纸笔推演先行
C2a(7.09)
代码之前先理解结构—画出栈的每一步操作
注释骨架 → 填充
C2b(7.12)
分阶段编译,每阶段只写 5 行—破掉"从零写"的恐慌
踩坑日志
C1(6.25)
每个 bug 都是学习资源—#1 到 #54
valgrind 零泄漏才叫跑通
C1
不通过 valgrind 不算完工
从不依赖完整代码
全程
拿到方向自己推,GK2 只需要"五处改动"清单
#
日期
教训
1
6.25
#define M 3 后不加分号—宏是文本替换,分号会被一起替换进代码
2
6.25
指针声明 ≠ 分配—int *p; scanf("%d", p); 往 NULL 写数据
6
6.25
fopen("result.csv", "w") 文件不存在时创建空文件—fp 永不 NULL
8
6.25
结构体未初始化—total 是垃圾值,必须先清零再累加
23
7.13
apply_operator 先 pop right 再 pop left—栈是 LIFO,顺序不能反
37
7.13
sizeof(ptr) 不是数组大小—是指针大小(8 字节)
54
7.13
switch 后加 return—否则 control reaches end of non-void function
GK1(6.22)
C1(6.25)
GK2(7.13)
C 收官(7.14)
文件数
1
2 源码 + 数据
1
5(2 源码 + 2 头文件 + Makefile)
结构体
Student(单科成绩)
Student(int *scores 嵌套数组)
Stack(data[100] + top)
Stack(拆到独立模块)
指针层级
一级(Student *)
二级 (Student **)
一级(Stack *)
一级
动态分配
malloc + realloc
malloc + realloc + 嵌套 malloc
无(固定数组)
无
文件 I/O
fprintf / fscanf
fprintf / fscanf + 反序列化
无
无
编译方式
gcc gk1.c
gcc C1c.c
gcc gk2.c
make
内存验证
无(当时还没学)
valgrind 11 allocs / 11 frees
valgrind 2 allocs / 2 frees
valgrind 0 errors, no leaks
阶段
心理状态
6.17–6.21
"malloc 是什么"—从零开始,每步都是新东西
GK1(6.22)
组织程序好复杂,我能独立写出来吗?指针和 realloc 让人紧张,但第一个项目跑通很兴奋
C1c(6.25)
二级指针差点劝退,但踩坑日志让每次报错变成"学会了什么"
C2a → C2b(7.09–7.12)
纸笔推演 + 注释骨架—找到方法论,不再恐慌
GK2(7.13)
半小时跑通—"我理解了结构,不是在背代码"
C 收官(7.14)
主动发现模块边界问题—"stack.c 不需要重新定义 Stack"
核心转变:从"怕写不出来"到"我知道怎么一步步推出来"。
Java 阶段(7.15 – 开学前):面向对象范式切换,目标为 AstrBot 插件和 Minecraft Mod 打基础。
学习项目,随意使用。