C
底层系统编程
- 001入门C 语言零基础起步:从安装编译器到第一次运行手把手完成 C 的第一次编译与运行:装编译器、逐行拆解 hello.c、gcc 两步走、第一个编译错误的定位,并埋下内存与地址的第一颗种子。
- 002入门C 语言概述:信任程序员的小语言以「50 岁仍是 TIOBE 前三」引入,讲清 C 的设计哲学(信任程序员、小标准库、无运行时)、标准演进 C89 到 C23、编译四阶段,并给出 C 与其他语言的能力对照。
- 003入门程序结构与基本语法:main、printf 与分号把 hello.c 的骨架摊开:main 的完整结构、printf 格式化占位符逐个实测、变量与类型初见、三类编译错误原文定位,附修改实验与四型练习。
- 004入门数据类型:类型系统、溢出与浮点的第一课用 sizeof 打印实验走进类型系统:整型家族的最小宽度与 limits.h、stdint.h 定宽类型的选型速查、无符号回绕与有符号溢出的 UBSan 实录、IEEE 754 浮点心智模型与 0.1 + 0.2 不等于 0.3 的 epsilon 解法。
- 005入门变量与常量:int x = 42 背后发生了什么用「未初始化变量打印出垃圾值」的实验开题,讲透声明与定义、初始化与赋值、左值右值第一课,四种常量(字面量、宏、const、枚举)怎么选,字符串字面量为什么改不得,三类变量 Bug 的编译期拦截。
- 006中级作用域、存储期与链接性:变量的一生与可见范围从「两个同名 total 互不干扰」与「static 局部变量记住值」两个实验开题,一次办齐变量的户口(四种作用域)、寿命(四种存储期)与跨文件身份(链接性),顺带核实 register 的真实现状与 _Thread_local 的用法。
- 007入门运算符与表达式:从优先级到未定义行为以 i = i++ 的事故现场开场:整数除法向零截断与 % 的符号、整型提升与寻常算术转换的完整阶梯、短路求值实验、a < b < c 陷阱、函数参数求值顺序实验、优先级速查表与三条记忆法,-Wall 与 UBSan 抓表达式错误的调试实录。
- 008中级位运算:掩码、移位与位级思维用「8 个开关塞进 1 个字节」掌握六个位运算符与掩码四件套:权限标志实战贯穿全文,-8 >> 1 的算术/逻辑右移实验、UBSan 当场抓越界移位、Brian Kernighan 置位计数、异或交换的同地址陷阱、大小端探针小实验,最后看 C23 的 0b 字面量、数字分隔符与 stdbit.h 函数族。
- 009入门控制流:分支、循环与跳转以成绩分档的三种写法(if 链、switch 分桶、表驱动)开题:悬空 else 配对规则、= 误作 == 的 -Wparentheses 实录、switch 穿透语义与 C23 [[fallthrough]]、case 整型常量限制与 1023 条下限、GNU 区间 case 扩展、for/while/do-while 心智模型与互化、goto 的两个可辩护用途(多层跳出与错误清理)、分号空语句与浮点累积误差调试实录,switch 状态机收尾。
- 010入门函数:声明、传值与递归以「平均分循环抄两遍」的 main 开题:原型如何让编译器替你查调用、C99 起隐式声明按错误处理、C23 起 foo() 即 foo(void)、swap 失败实验引出传值语义与指针版预告、返回局部地址的 -Wreturn-local-addr 实录、fib(30) 的 269 万次调用重复计算实验、调用栈直觉、main 的 argc/argv 与 echo $? 退出码实验;作用域交 055、函数指针交 170、可变参数交 100、inline 交 300。
- 011入门递归与分治:把问题交给更小的自己以"逐帧追踪 factorial 栈展开"为主线学 C 递归:基准情况与递归步的完整推论、汉诺塔与猴子吃桃两道经典、间接递归与前置声明、栈深实测与尾递归的真实边界、分治三步与二分查找,附防 int 溢出的中点写法与四道遮代码自检练习。
- 012中级可变参数函数:printf 是怎么炼成的从「printf 为什么能吃任意个参数」出发,用 stdarg.h 四件套手写 sum_ints 与迷你 my_printf(支持 %d %c %s %f),讲透默认参数提升、va_copy、显式个数/格式串/哨兵三种传递约定,以及 v 前缀转发封装与参数不匹配的调试实录。
- 013入门枚举与 typedef:给类型起好名字从 0/1/2 魔数事故引入 enum:默认递增与显式赋值、-Wswitch 穷举检查、枚举常量与 int 的关系;typedef 三步读法、typedef vs
- 014入门数组:连续内存与越界边界用「存全班 40 个成绩」的问题掌握数组:五种初始化写法与剩余元素清零实验、下标从 0 开始的偏移量心智模型、越界访问的 stack-buffer-overflow 现场、sizeof 求元素个数与函数内失效的原因、VLA 的 C11 抉择与栈风险,以及数组不能整体赋值、比较、传值的三个「不能」与替代。
- 015中级C 字符串处理C 字符串专篇:char 数组与 '\0' 终止符心智模型、字面量与 char* 的存储差异、string.h 全家(strlen/strcpy/strncpy/strcat/strcmp/strchr/strstr/strtok/strerror)逐个可跑示例、sizeof 与 strlen 混用陷阱,附日志解析、配置键值切分、argv 分词与提取数字实战。
- 016入门结构体与联合:自定义类型打包从「把学生的姓名/学号/成绩打包」出发掌握结构体与联合:tag 声明与 . -> 成员访问、顺序/指定/嵌套三种初始化、逐成员拷贝的赋值语义(数组成员一起搬走)、== 比较的编译错误与 memcmp 的 padding 陷阱、调换成员顺序 sizeof 变化的实验,以及 union 共享存储、写 A 读 B 的边界与 tag+union 变体记录、匿名 union(C11)。
- 017中级指针:地址、解引用与指针算术从「swap 为什么救不回来」入门指针:房间号心智模型、& 与 * 互逆、NULL 判空、const 三组合读法口诀、按元素跨步的指针算术、void* 的能与不能,附 SEGV 调试实录与 minmax 双输出小项目。
- 018中级指针与数组:似是而非的边界从「sizeof 在 main 里是 40、进函数变 8」拆解数组退化:三条例外、传数组即传指针、char *s 与 char a[] 的存储差异、int *p[10] 与 int (*p)[10] 读法拆解,附二维数组当 int** 传的段错误现场。
- 019进阶二级指针与指针数组C 语言二级指针(多级间接寻址)的完整工程体系:形式化定义与内存模型、输出参数与二级指针游走等工程模式、内存安全与严格别名、陷阱调试性能全景,附 Unix main/SQLite/Redis 案例与跨语言对比。
- 020进阶C 链表与节点式数据结构用 struct Node 与 malloc 手写链表这一节点式数据结构:节点生命周期、头插尾插与按位删除、二级指针免特判改头、双指针反转、虚拟头节点取舍,附完整 slist 库、Linux 内核 list_head 与解释器符号表案例,通讯录、任务队列与 LRU 缓存三个实战场景。
- 021中级函数指针与回调:把行为当参数传从 qsort「一行排任意类型」的读心术之谜出发:读懂函数指针声明、函数名退化与两种调用写法、typedef 三步法;qsort 比较器完整实战(含减法溢出陷阱实录)、带上下文的泛型 apply、事件处理器表,讲清 C 函数指针为什么不是闭包,以及对象指针与函数指针互转的标准边界。
- 022中级跳转表:用表驱动替换长 switch从一个 20 个 case、增删命令要改两处的 switch 分发器出发:用枚举做索引、函数指针数组做表体、指定初始化器保证表项对位,完成一个支持 help 列命令的表驱动命令行分发器;对比表驱动与 switch、if-else 链的工程取舍,附字符串命令的哈希查找预告与「漏初始化表项调用 NULL」的段错误调试实录。
- 023中级复杂声明解析C 语言复杂声明的形式语法、右左法则、函数指针与数组指针的解析方法,涵盖 cdecl 工具、ABI 规范与真实项目案例。
- 024中级动态内存:大小运行时才确定的数组用「玩家人数运行时才知道」的积分榜场景掌握 malloc/calloc/realloc/free 四件套:分配即判 NULL、用 LeakSanitizer 当场抓泄漏、free 后置 NULL 纪律,附预测题与调试实录。
- 025进阶内存深水区:五段布局与堆事故现场拆开 200 建立的黑盒:打印地址画出进程五段内存布局,逐行解读 use-after-free 与 double free 的 ASan 报告,讲透 realloc 的搬移语义与丢指针经典坑,柔性数组一句话。
- 026中级内存对齐:struct 的大小为什么不是成员相加从「三个成员手算 6 字节,sizeof 却说 12」出发理解对齐动机,用 alignof 与 offsetof 实验量出三条 padding 规则,学会
- 027进阶布局深水区:成员排序、跨平台与序列化陷阱把 220 的对齐规则用于工程:成员排序前后 sizeof 对照实验、64 位指针与 32 位平台的布局差异、位域为什么不可移植、存档与网络传输为什么必须显式编码而不是 memcpy 结构体。
- 028进阶位域:把结构体压到比特级及其代价从一个 32 位硬件寄存器出发学位域:语法与 :0 对齐、位序/跨存储单元/int 符号性三大实现定义,GCC 与 MSVC 同一结构体 sizeof 不同的实验,把位域写进文件后读回错位的踩坑现场,volatile 位域的 MMIO 争议,附位域与掩码的工程取舍表。
- 029进阶函数调用栈帧:一次调用的完整旅程拆开 210 地图上 stack 那一段:无限递归数到几十万层才崩的现场实验,栈帧的建立与拆除、System V 与 Windows x64 传参差异、递归深度与尾调用优化、大局部数组与缓冲区溢出两类栈事故的逐行报告解读。
- 030中级const 与 volatile:两个限定符的正交语义从舞台灯控固件出发掌握 const 与 volatile 的正交语义:const 的只读契约与真实优化边界(文件内可折叠、跨编译单元不行)、volatile 三经典场景(MMIO、信号标志、setjmp)、const volatile 组合,以及「不原子、不排序、不当锁」的能力边界。
- 031进阶volatile 深水区:优化器、寄存器与信号同一个忙等循环 -O0 能退出、-O2 死循环:从 as-if 规则拆解编译器凭什么省略读写,完整跑通 MMIO 模拟寄存器与信号处理实战,用丢更新与假锁两起事故验证 volatile 不提供原子性与内存序,给出 volatile、_Atomic、互斥锁的职责边界表。
- 032进阶泛型选择:_Generic 与类型分派用「取个绝对值要记四个名字」引出 C11 _Generic:编译期按类型查表、控制表达式不求值的副作用实验、重复类型的报错实录、数组和 const 进开关前的三步整形;宏 + _Generic + 函数族拼出类型安全的伪重载 API,tgmath.h 实现原理与 C23 typeof 协同收尾。
- 033中级预处理器与宏:编译前的文本手术用 gcc -E 把 main.c 的预处理产物摊开,一图看穿「宏只是文本替换」:编译四阶段心智模型、#include 搜索路径 gcc -v 实验、头文件守卫三写法;函数式宏的 SQUARE(i++) 事故实录与括号纪律、# 与
- 034中级内联函数与宏:展开的艺术与代价用 MAX(i++, j++) 算出两个答案的事故开场:objdump 亲眼看内联前后的机器码、inline 只是建议而优化等级才是开关、C99 inline 三形式的链接语义与 undefined reference 与 multiple definition 两宗实录、static inline 为何是头文件函数的默认答案、宏与内联函数的工程决策对照表与内核编码规范的准则出处、代码膨胀与递归的代价。
- 035中级多文件编译:翻译单元、头文件与链接器把 200 行单文件拆成 main.c + utils.c + utils.h 后撞上 undefined reference:从链接器报错进入多文件世界。翻译单元互不可见、声明给人看定义给链接器、一条命令与分开 -c 编译的等价实验、nm 读符号表、undefined reference 与 multiple definition 两大报错逐个复现修复、extern 共享变量与 include/src 工程布局,全程裸 gcc 看得见每一步。
- 036中级动态库与静态库:代码的打包与复用把 310 篇的 utils.c 打包成能交付的库:ar 打包 .a 与链接顺序惨案、-fPIC 与 -shared 造 .so、soname 三件套命名与软链、ldd 与 readelf -d 看依赖、cannot open shared object file 经典现场的三种修复、dlopen 插件机制,静态与动态取舍一张表。
- 037中级进程与管道:fork、exec 与字节流用「ls | grep .c 是怎么跑起来的」引出 fork/exec/wait/pipe 四件套:fork 返回两次与写时复制、printf 缓冲重复输出的事故现场、僵尸进程收尸、EOF 与 SIGPIPE 两种管道死锁,最后亲手实现一个支持单管道的迷你 shell。
- 038进阶信号处理:异步事件的捕获与纪律从 Ctrl+C 拆开信号的完整体系:软件中断心智模型、signal 与 sigaction 的历史恩怨与 SA_RESTART、C17 7.14.1.1 的处理器纪律、printf 偶发死锁的现场分析、SIGCHLD 收割僵尸、sigaltstack 兜底烧穿的栈。
- 039进阶共享内存与信号量:System V IPC两个互不相干的进程要共写一个计数器:ftok 造钥匙、shmget/shmat 挂接共享内存并用 ipcs 实地查看,先跑无保护计数器的竞态现场,再上 System V 信号量 P/V 封装,完整写者读者双进程示例,直面「进程退了段还在」的生命周期陷阱与 ipcrm 清理实录。
- 040中级线程与并发:竞态、临界区与同步思想全局计数器被两个执行流同时自增,100000 次 x 2 却少于 200000:从 count++ 的读-加-写三步拆出竞态条件,用 C11 5.1.2.4 说清数据竞争是未定义行为,建立临界区、互斥、条件变量与生产者消费者的思想地基,死锁四条件与锁排序对策,ThreadSanitizer 实地抓出数据竞争。
- 041进阶POSIX 线程:pthread 从创建到同步把 360 的计数器事故亲手复现再亲手修复:-pthread 编译纪律、pthread_create 的错误码契约与传参陷阱、join 与 detach 的取舍、互斥锁四件套、条件变量的虚假唤醒与 while 重查,最终写完有界队列版生产者消费者,附 pthread_cancel 争议与同步原语全家福一瞥。
- 042进阶原子操作与内存模型:不加班的同步从两个线程各加十万次、总和却对不上的丢失更新实验出发:_Atomic 类型与 stdatomic.h 操作族、五种 memory_order 的行为表与发布-订阅实验、compare_exchange_weak 的伪失败、原子与互斥锁的分工表,附 ATOMIC_VAR_INIT 弃用等版本口径与三起事故实录。
- 043进阶Socket 网络编程:从 echo 服务器开始用 30 行代码写出 TCP echo 服务器并亲手连上它:socket 是文件描述符的网络版、字节序转换实验、TCP 五步流程与 accept 的新 fd 语义、UDP 无连接对比、粘包半包与 recv_n 封装、SIGPIPE 再现与 MSG_NOSIGNAL,附 bind 失败三因与 fd 泄漏的 /proc 自查实录。
- 044进阶文件系统操作:从 open 到 inode从「同一个复制程序的两条路」下到 POSIX 系统调用层:open 的 flags 与 O_CREAT 缺 mode 的编译陷阱、read/write 部分读写契约与循环封装、lseek 与 1GB 空洞文件实验、stat 家族与 S_ISREG 宏族、目录递归遍历、硬链接与符号链接、unlink 的延迟释放与 rename 的原子替换。
- 045进阶跨平台编程:Windows 与 POSIX 的沟壑与搭桥从「Linux 编译干净的程序到 MSVC 报一串错」画出差异地图:编译器方言与 MSVC 的 C 标准现状、路径分隔符与换行转换、文件/进程/线程/动态库/信号/套接字/时间七张对照表、条件编译的组织学与最小兼容层、LLP64 数据模型的 long 陷阱,逐一收口 320/330/340/370/390 各篇留下的 Windows 伏笔。
- 046中级C POSIX 与系统调用速查手册POSIX 系统调用速查:文件描述符、进程控制(fork/exec/wait)、管道、信号、内存映射与目录遍历,含返回值语义、完整示例与常见陷阱。
- 047中级文件 I/O:fopen 到 fclose 的完整闭环从「程序退出后数据去哪了」出发建立流的心智模型:七种 fopen 模式与判 NULL、字符/行/格式化/块四大读写家族、feof 多读一次的调试实录、缓冲与 fclose 的落盘实验,以仿 wc 的统计器把全篇串成一条线。
- 048入门C 标准库速查手册C 标准库常用头文件与函数速查:stdio、string、stdlib、math、ctype、time 的签名、返回值语义与典型陷阱,含完整示例。
- 049中级安全函数与边界检查:溢出从源头杜绝从 strcpy 溢出现场出发,给全危险函数地图与 snprintf 正解,讲透 strncpy 无终止符、sizeof(指针)、整数转 size_t 三大经典坑,核实 Annex K(_s 函数)的真实生态位,收口于编译期检查清单。
- 050进阶国际化与本地化:让程序说世界语从 wprintf 输出为空与 strlen("中文")==6 两个现场开题,讲清 locale 机制、wchar_t 的平台分裂、多字节转换状态机与 UTF-8 优先的现代纪律,收口于 gettext 翻译流程与五则调试实录。
- 051中级构建系统:从 Makefile 到 CMake8 个文件的项目手敲 gcc 到崩溃:从时间戳增量构建的原理学会 Make(四要素、tab 惨案、$@ $< $^、模式规则、.PHONY 失灵实录、-MMD 头文件依赖),再上 CMake(cmake_minimum_required 钉策略、target-based 现代写法、out-of-source 构建),链接顺序为何被 CMake 自动接管的机制回扣。
- 052中级C 单元测试与断言C 程序测试:assert 的契约语义与 NDEBUG 陷阱、测试文件组织(每模块一 test.c)、三步手写最小断言框架、Unity/CMocka/libcheck 选型对比,并接入 Makefile 目标与 CI 警告门禁形成质量闭环。
- 053中级静态分析与 SanitizersC 代码静态分析与 Sanitizers 四件套:编译器警告分级、cppcheck/clang-tidy 工作流、ASan/UBSan/TSan/MSan 原理与实战、CI 警告门禁。
- 054中级动态调试与 GDB 实战C 程序动态调试实战:GDB 断点/观察点/多线程调试、core dump 分析、段错误与死锁的复现-定位-修复模式、远程调试与反向调试。
- 055中级C Valgrind 内存检测用 Valgrind 检测 C 程序内存问题:memcheck 实战走查、泄漏分类解读、各工具选型(cachegrind/callgrind/massif/helgrind)与 ASan 对比。
- 056进阶C23 上手:五个最有感的新特性上手 C23 对日常写代码最有感的五个特性——数字分隔符、nullptr、bool 关键字、auto 与 [[attributes]],用 gcc -std=c23 验证标准级别,并分清「标准没开」与「编译器太旧」两类报错。
- 057进阶C23 深水区:编译期特性与升级策略接着 C23 上手往深处走:#embed、typeof、constexpr、ckd_* 四个编译期深水特性,查编译器支持矩阵的三板斧、C2y 草案现状,以及旧代码库「先开警告再切标准」的升级路线。
- 058进阶属性与编译器扩展:让编译器当 reviewer用 format 属性抓 printf 包装函数的事故开题,讲透 C23 五个标准属性的语法与语义,再进 GCC __attribute__ 实战(packed/aligned/constructor/always_inline),收口于跨编译器迁移表与可移植纪律。
- 059进阶嵌入式 C 编程:在 64KB 里跑稳从闪烁 LED 的裸机 main 出发串起嵌入式 C 主线:寄存器就是固定地址的内存、上电到 main 之间启动代码搬 .data 清 .bss、ISR 纪律与关中断临界区、看门狗与栈核算、交叉编译与 QEMU 仿真 mps2-an385,附 printf 重定向串口与三起调试实录。
- 060进阶C 与汇编交互:从反汇编到内联汇编objdump 反汇编自己的 add 函数起步:gcc -S 的 -O0/-O2 对照看寄存器分配,手写 .s 与 C 互相调用(System V x64 约定、名字修饰、栈对齐纪律),GCC 基本 asm 与扩展 asm 四段结构逐段讲透,volatile asm 与 "memory" clobber 防住哪类优化,什么时候值得写汇编与三类翻车现场。