掌握 C 语言
从基础到系统编程

专注分享 C 语言学习路径、代码实例、内存与指针、数据结构与算法,帮助你扎实掌握底层编程能力。

学什么

围绕 C 语言核心知识,覆盖从入门到工程实战

📘

语法基础

变量、运算符、控制结构、函数、作用域、存储类别等核心语法点。

🔗

指针与内存

指针运算、数组与指针、动态分配、内存泄漏排查与常见陷阱。

🧱

数据结构

链表、栈、队列、二叉树、哈希表的 C 实现与典型应用。

⚙️

算法实战

排序、查找、递归、动态规划、图论的 C 代码模板与解析。

🐧

Linux 系统编程

文件 I/O、进程、线程、信号、Socket 网络编程入门。

🛠️

工程化

Makefile、GDB 调试、Valgrind 内存检测、单元测试与代码规范。

技术文章

每周更新 C 语言干货,从语法细节到工程实践

预处理

C语言条件编译与多平台支持完全指南

条件编译是C语言预处理的核心功能,详解宏定义、跨平台开发技巧与条件分支管理。

阅读全文 →
工程化

C语言单元测试完全指南

详解Google Test、Cmocka与自研测试框架,构建完善的C语言单元测试体系。

阅读全文 →
工程化

C语言调试技巧进阶完全指南

从printf调试到GDB高级技巧,从Valgrind内存检测到core dump分析,全面提升你的C语言调试能力。

阅读全文 →
标准库

C语言标准库函数完全指南

详解printf、scanf、malloc、free、memcpy、memset等常用标准库函数的原理、使用技巧与常见陷阱。

阅读全文 →
代码片段

C语言实用代码片段大全

字符串处理、文件操作、内存管理、时间处理等常用代码模板,开箱即用,适合日常开发参考。

阅读全文 →
综合

C语言核心概念速查表

指针、内存、数组、函数、结构体等核心概念一页速查,适合面试复习与日常开发参考。

阅读全文 →
系统编程

C语言可重入函数与信号安全完全指南

详解可重入函数的概念、信号处理中的安全问题与异步信号安全设计,助你编写安全的信号处理代码。

阅读全文 →
系统编程

C语言原子操作与无锁编程完全指南

详解stdatomic、内存顺序、锁-free数据结构设计与性能优化,助你掌握高效并发编程技能。

阅读全文 →
工程化

C语言错误处理与调试技巧完全指南

详解errno、perror、assert、错误码设计与GDB远程调试技能,帮助你编写更可靠的C程序。

阅读全文 →
系统编程

C语言时间编程完全指南

详解时间获取、格式化、定时器与clock_gettime高精度计时,助你掌握时间处理技能。

阅读全文 →

学习路线

分阶段循序渐进,每个阶段都有明确目标

语法入门

变量类型、流程控制、函数与数组,写出 100 行可运行的小程序。

指针进阶

吃透指针、数组、字符串与多级指针,能独立完成动态数据结构。

数据结构

用 C 手写链表、栈、队列、二叉树并配合 LeetCode 练习。

系统编程

Linux 下学习文件、进程、线程、Socket,编写 mini-Shell、HTTP 服务。

项目实战

实现内存池、命令行工具、JSON 解析器或简易数据库。

调优与规范

掌握 GDB、Valgrind、性能分析与工业级编码规范。

来段代码尝尝

经典「Hello World」与单链表节点定义

hello.c
/* 经典入门 + 单链表节点 */
#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int val;
    struct Node *next;
} Node;

int main(void) {
    Node *head = malloc(sizeof(Node));
    head->val  = 42;
    head->next = NULL;

    printf("Hello, ohc.cc! value=%d\n", head->val);
    free(head);
    return 0;
}

常见错误 vs 正确写法

对比 3 组典型代码,避开 C 语言常见陷阱

错误 · 返回局部变量地址
int *get_val(void) {
    int x = 10;
    return &x;  /* x 在栈上,返回后失效 */
}
正确 · 使用静态或堆内存
int *get_val(void) {
    int *p = malloc(sizeof(int));
    *p = 10;
    return p;  /* 调用方负责 free */
}
错误 · 未检查 malloc 返回值
char *s = malloc(256);
strcpy(s, "hello");  /* s 可能为 NULL */
正确 · 判空后再使用
char *s = malloc(256);
if (!s) return NULL;
strcpy(s, "hello");
错误 · sizeof 误用
int *arr = malloc(10 * sizeof(arr));
/* sizeof(arr) = sizeof(int*) */
正确 · 用类型或变量
int *arr = malloc(10 * sizeof(*arr));
/* 或 sizeof(int),与类型解耦 */

推荐资源

经典书籍与在线练习

📖

《C 程序设计语言》

Brian Kernighan & Dennis Ritchie 经典之作,简称 K&R,必读。

📗

《C 和指针》

Kenneth Reek 著,系统讲解指针与内存模型,进阶首选。

📕

《C 专家编程》

Peter van der Linden 著,揭示 C 语言中的陷阱与高级技巧。

💻

LeetCode / 牛客

使用 C 完成算法练习,巩固指针与数据结构应用。

📚

《Linux 高性能服务器编程》

游双著,系统讲解 Linux 网络编程与服务器开发。

🌐

cppreference.com

C / C++ 标准库官方权威文档,遇到 API 不清楚先查这里。