Advanced Programming 深度解析

Folder 2: advanced-programming-columbia-cs-3157-master

1. 前置知识解释 (Prerequisite Knowledge)

理解这些核心概念是阅读代码的基石。

C语言基础 & 内存

  • 指针 (Pointers): 内存地址的直接操作。
  • 内存管理 (Malloc/Free): 堆(Heap)与栈(Stack)的区别。手动管理生命周期。
  • 结构体 (Structs): 数据封装 (Node, MdbRec)。

数据结构

  • 链表 (Linked List): 节点连接,动态增长。
  • 数组与指针: a[i]*(a+i)

系统编程

  • 进程 (Processes): fork, exec, waitpid
  • 网络 (Sockets): Client-Server 模型,TCP 连接流程。
  • HTTP: 文本协议,Header/Body 分离。

2. 工具箱范围界定 (Toolbox Scope)

你的武器库,分为三个层级。

标准 C 库 (The Basics)

stdio.h, stdlib.h (内存/随机/转换), string.h (字符串操作), ctype.h (字符检查)。

POSIX 系统调用 (The Power)

unistd.h (fork, exec, read, write), sys/socket.h (网络), netdb.h (DNS解析)。

自定义 & C++ (The Expansion)

mylist.h (通用链表), mdb.h (数据库定义), STL (deque, string)。

3. 详细解释文件内容

A. 基础 C 语言训练 Lab 1 & 2

convert.c

功能: 整数进制转换。

亮点: 使用位操作 (x >> i) & 1 获取二进制位,并手动处理每4位的空格格式化。

twecho.c

功能: 双重回显 (Two Echoes)。

逻辑: 使用 malloc 分配指针数组 (char**),深拷贝每个字符串并大写转换。关键点在于复杂的内存清理逻辑。

isort.c

功能: 插入排序演示。

逻辑: 动态分配数组,填充随机数,排序。演示了指针如何作为迭代器使用。

B. 通用链表库 核心基石 Lab 3

mylist.h / mylist.c

这是整个课程的基础设施。它模拟了 C++ STL list 的功能,但是用 C 实现的。

revecho.c

使用 struct List 存储命令行参数,演示链表的实际应用。

C. 数据库工具 Lab 4 & 5

mdb.h / mdb-lookup.c

功能: 简单的数据库查询工具。

流程: fopen -> fread (加载到链表) -> strstr (在链表中搜索) -> 输出。

mdb-add.c

功能: 追加记录。使用 "ab" (Append Binary) 模式打开文件。

D. 网络编程 进阶核心 Lab 6 & 7

mdb-lookup-server.c (Server)

将单机版的 mdb-lookup 变为网络服务。

http-client.c (Client)

手动构造 HTTP 请求包:GET /path HTTP/1.0\r\nHost:...\r\n\r\n。难点在于解析响应,找到 Head 和 Body 的分界线。

http-server.c

静态文件服务器 + 反向代理。根据 URL 判断是读取文件还是转发请求给后端数据库服务器。

E. C++ 面向对象 Lab 8-10

twecho2.cpp: 引入 Class 和 RAII (资源获取即初始化),自动管理内存。
mystring.cpp: 实现 Rule of Three (析构、拷贝构造、赋值),深入理解 C++ 内存管理。
tlist.h: 引入模板 (Templates),实现类型安全的通用容器。

4. 条件反射训练 (Reflexive Thinking)

看到代码中的这些模式,你的大脑应该立即响起警报。

🚨 看到 malloc / new
反射: "哪里 free / delete 了?"
检查: 异常分支是否提前 return 了?循环里是不是多次 malloc 了?
🧠 看到 struct Node { ... *next; }
反射: "这是链表。"
思考: 头节点为空 (NULL) 怎么办?是不是该用哨兵节点 (Sentinel)?
🔄 看到 fork()
反射: "进程分叉了,我是父还是子?"
行动: 检查 if(pid==0)。父进程有没有 waitpid?小心僵尸进程 (Zombie)!
🌐 看到 bind / listen / accept
反射: "这是服务器端。"
联想: 会阻塞吗?网络字节序 (htons/htonl) 转了吗?