CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
C 语言入门/课时/综合练习
RawBlame
课时目录12 节

C 语言入门

  1. 01C 是什么
  2. 02类型与变量
  3. 03控制流与运算符
  4. 04函数
  5. 05指针与内存
  6. 06数组与字符串
  7. 07结构体与联合体
  8. 08预处理器
  9. 09编译与构建
  10. 10并发与进程
  11. 11调试与测试
  12. 12综合练习

综合练习

实现动态数组 + Makefile。

40 分钟

综合练习

把类型、指针、结构体、构建与测试串起来,实现一个可增长的动态数组(类似 Java ArrayList 的 C 版)。对照 /roadmaps/c 完成本 track 闭环。

学习目标

  • 实现带 push、get、free 的动态 IntVector
  • 用 Makefile 组织多文件编译
  • 编写至少 3 个测试用例
  • 规划 C 进阶学习路径

核心概念

项目需求

  1. IntVector:data 指针、size、capacity
  2. intvec_push(v, value):必要时 realloc 扩容(倍增策略)
  3. intvec_get(v, index):越界返回错误码
  4. intvec_free(v):释放内存,防止泄漏
  5. 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
动态数组手动 reallocstd::vectorArrayList
内存显式 freeRAII / 析构GC
错误处理返回码异常 optional异常
构建MakefileCMakeMaven

完成本练习后,阅读同功能的 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 路线图继续深入系统编程或工程实践即可。

加载本节练习…
← 上一课调试与测试