大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
综合练习
把类型、指针、结构体、构建与测试串起来,实现一个可增长的动态数组(类似 Java ArrayList 的 C 版)。对照 /roadmaps/c 完成本 track 闭环。
学习目标
- 实现带
push、get、free的动态IntVector - 用 Makefile 组织多文件编译
- 编写至少 3 个测试用例
- 规划 C 进阶学习路径
核心概念
项目需求
IntVector:data指针、size、capacityintvec_push(v, value):必要时realloc扩容(倍增策略)intvec_get(v, index):越界返回错误码intvec_free(v):释放内存,防止泄漏- Makefile 构建;可选 cmocka / 简单
main测试
目录与实现提示
intvector/
Makefile
intvector.h
intvector.c
main.c
test_main.c # 可选
/* intvector.h */
#ifndef INTVECTOR_H
#define INTVECTOR_H
#include <stddef.h>
typedef struct {
int *data;
size_t size;
size_t capacity;
} IntVector;
int intvec_init(IntVector *v);
int intvec_push(IntVector *v, int value);
int intvec_get(const IntVector *v, size_t index, int *out);
void intvec_free(IntVector *v);
#endif
/* intvector.c 核心片段 */
#include "intvector.h"
#include <stdlib.h>
int intvec_push(IntVector *v, int value) {
if (v->size >= v->capacity) {
size_t new_cap = v->capacity ? v->capacity * 2 : 4;
int *p = realloc(v->data, new_cap * sizeof(int));
if (!p) return -1;
v->data = p;
v->capacity = new_cap;
}
v->data[v->size++] = value;
return 0;
}
/* main.c */
#include <stdio.h>
#include "intvector.h"
int main(void) {
IntVector v;
intvec_init(&v);
for (int i = 0; i < 10; i++) intvec_push(&v, i * i);
int val;
intvec_get(&v, 5, &val);
printf("v[5]=%d size=%zu\n", val, v.size);
intvec_free(&v);
return 0;
}
进阶路线
| 方向 | 建议 |
|---|---|
| 系统编程 | Linux 系统调用、操作系统课程 |
| 嵌入式 | 单片机、RTOS |
| 进阶语言 | C++(RAII + STL) |
| 路线图 | /roadmaps/c 后续节点 |
与 C++/Java 对照
| 能力 | 本练习(C) | C++ | Java |
|---|---|---|---|
| 动态数组 | 手动 realloc | std::vector | ArrayList |
| 内存 | 显式 free | RAII / 析构 | GC |
| 错误处理 | 返回码 | 异常 optional | 异常 |
| 构建 | Makefile | CMake | Maven |
完成本练习后,阅读同功能的 C++ vector 或 Java ArrayList 源码,体会抽象层差异。
练习
- 完成
IntVector全部 API 并通过测试 - Makefile 支持
make、make test、make clean - 用 ASan 构建,确认无泄漏
- 在 /roadmaps/c 标记本 track 已完成节点
毕业清单
- 能独立写含指针、malloc、struct 的小模块
- 会用 gcc 警告选项与 GDB 基本命令
- 通读 12 课,理解 C 与 Java 最大差异在内存与类型
- 选一个方向(系统/嵌入式/C++)继续 /roadmaps/c
小结
动态数组 + Makefile + 测试 = C 入门闭环。 恭喜完成 C 语言入门——按 c 路线图继续深入系统编程或工程实践即可。