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

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

学什么

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

📘

语法基础

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

🔗

指针与内存

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

🧱

数据结构

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

⚙️

算法实战

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

🐧

Linux 系统编程

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

🛠️

工程化

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

技术文章

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

系统编程

C语言定时器编程完全指南

timer_create、timer_settime、信号驱动定时器与精度控制,助你掌握定时器编程的核心技能。

阅读全文 →
系统编程

C语言epoll编程完全指南

epoll_create、epoll_ctl、epoll_wait、LT与ET模式,助你掌握高性能I/O多路复用的核心技能。

阅读全文 →
系统编程

C语言内存映射与mmap完全指南

mmap、munmap、msync、匿名映射与共享内存,助你掌握内存映射的核心技能。

阅读全文 →
系统编程

C语言动态库加载完全指南

dlopen、dlsym、动态加载、插件架构与符号解析,助你掌握动态库加载的核心技能。

阅读全文 →
系统编程

C语言本地化与Unicode处理完全指南

setlocale、宽字符、Unicode转换与多语言支持,助你掌握C语言本地化编程的核心技能。

阅读全文 →
系统编程

C语言守护进程编程完全指南

daemon函数、会话脱离、PID文件与日志重定向,助你掌握守护进程编程的核心技能。

阅读全文 →
系统编程

C语言文件锁与并发控制完全指南

文件锁、记录锁、flock与fcntl,助你掌握文件级并发控制的核心技能。

阅读全文 →
系统编程

C语言进程间通信完全指南

管道、消息队列、共享内存、信号量与Socket,助你掌握进程间通信的核心技能。

阅读全文 →
系统编程

C语言信号处理完全指南

signal函数、sigaction、信号集、实时信号与安全函数,助你掌握信号处理的核心技能。

阅读全文 →
系统编程

C语言错误处理完全指南

errno机制、错误传播、资源清理与防御性编程,助你构建健壮的错误处理体系。

阅读全文 →

学习路线

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

语法入门

变量类型、流程控制、函数与数组,写出 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 不清楚先查这里。