数组与字符串
数组就是一段连续内存,这句话能解释 C 里九成的数组 bug。地址实测、退化规则、\0 终止符、strncpy 的陷阱,以及越界访问为什么"看起来能用"。
按章节地图推进的技术笔记:C 语言、C++、数据结构、并发、Qt 6、Windows/Win32、Linux、操作系统、网络、嵌入式、数据库、构建与调试。基于 Astro 构建,部署在 GitHub Pages。
RSS 订阅数组就是一段连续内存,这句话能解释 C 里九成的数组 bug。地址实测、退化规则、\0 终止符、strncpy 的陷阱,以及越界访问为什么"看起来能用"。
C 的语法看着小,坑集中在三处:类型的真实宽度、混合运算的隐式转换、以及把"求值顺序"当成"优先级"。所有数字都在本机 MinGW GCC 13.1.0 上实测。
switch 的 fallthrough 是默认行为、空括号的函数声明不检查参数、尾递归优化在 C 里根本没有保证——这一节把流程控制和函数边界的规则一次说清,所有结论都有编译器和反汇编作证。
栈、堆、静态区的真实地址分布,malloc 与 calloc 的差别值一次 memset,内存池比逐个分配快在哪,以及在没有 ASAN 的工具链上用一张账本抓泄漏。
文本模式在 Windows 上到底改了什么、r+ 读完不 fseek 就写会静默丢数据、feof 为什么必须放在读之后判断,以及 C11 的 x 模式在本机 msvcrt 上根本不可用。
指针算术的真实语义、const 的传递规则为什么只给警告、减法比较器怎么把 qsort 排错、释放后读为什么不崩反而更危险,以及返回栈地址在本机如何当场段错误。
一行源码变成 1102 行、宏的括号为什么能决定成败、目标文件里的符号表怎么看、头文件守卫漏掉会报什么错——把"编译"拆成四步看清楚。
volatile 到底保证什么——两条反汇编指令说清;忙等待为什么会被整个删掉、没有堆怎么分配内存、栈预算怎么量,以及 -Os 比 -O2 小在哪。