当前位置:首页 > C > 正文

C语言动态数组实现(从零开始掌握动态内存分配与数组扩容)

在学习 C语言动态数组 之前,你可能已经熟悉了静态数组。静态数组在定义时必须指定大小,且无法在运行时改变。但在实际开发中,我们常常不知道数据量的大小,这时就需要使用动态数组——它能根据需要自动调整容量。本文将手把手教你如何用 C 语言实现一个简单的动态数组,适合编程小白阅读。

为什么需要动态数组?

静态数组有以下局限:

  • 大小在编译时确定,不能改变;
  • 若分配过大,浪费内存;分配过小,可能溢出;
  • 不适用于数据量不确定的场景(如读取文件、用户输入等)。

而通过 动态内存分配(使用 mallocrealloc 等函数),我们可以创建一个可以根据需要自动扩容的数组结构。

C语言动态数组实现(从零开始掌握动态内存分配与数组扩容) C语言动态数组 动态内存分配 C语言教程 数组扩容 第1张

设计思路

我们将封装一个简单的动态数组结构体,包含以下成员:

  • data:指向实际存储数据的指针;
  • size:当前已存储元素个数;
  • capacity:当前分配的总容量。

当添加新元素但空间不足时,我们会将容量翻倍(或其他策略),并使用 realloc 重新分配内存。

完整代码实现

下面是一个完整的、可运行的 C 语言动态数组实现:

#include <stdio.h>#include <stdlib.h>typedef struct {    int* data;    int size;    int capacity;} DynamicArray;DynamicArray* create_array(int initial_capacity) {    DynamicArray* arr = (DynamicArray*)malloc(sizeof(DynamicArray));    if (!arr) {        fprintf(stderr, "内存分配失败!\n");        return NULL;    }    arr->data = (int*)malloc(initial_capacity * sizeof(int));    if (!arr->data) {        free(arr);        fprintf(stderr, "数据内存分配失败!\n");        return NULL;    }    arr->size = 0;    arr->capacity = initial_capacity;    return arr;}void push_back(DynamicArray* arr, int value) {    if (arr->size >= arr->capacity) {        arr->capacity *= 2;  // 扩容为原来的两倍        arr->data = (int*)realloc(arr->data, arr->capacity * sizeof(int));        if (!arr->data) {            fprintf(stderr, "扩容失败!\n");            exit(1);        }    }    arr->data[arr->size++] = value;}void print_array(DynamicArray* arr) {    printf("[");    for (int i = 0; i < arr->size; i++) {        printf("%d", arr->data[i]);        if (i < arr->size - 1) printf(", ");    }    printf("]\n");}void free_array(DynamicArray* arr) {    free(arr->data);    free(arr);}int main() {    DynamicArray* arr = create_array(2);    for (int i = 1; i <= 10; i++) {        push_back(arr, i);    }    printf("当前数组内容: ");    print_array(arr);    printf("容量: %d, 大小: %d\n", arr->capacity, arr->size);    free_array(arr);    return 0;}

代码说明

  • create_array:初始化动态数组,分配初始内存;
  • push_back:向数组末尾添加元素,若空间不足则扩容;
  • print_array:打印当前数组内容;
  • free_array:释放所有动态分配的内存,防止内存泄漏。

运行该程序,你会看到输出:

当前数组内容: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]容量: 16, 大小: 10

可以看到,虽然我们只添加了 10 个元素,但容量自动从 2 → 4 → 8 → 16 扩展,体现了 数组扩容 的能力。

注意事项

  • 每次调用 mallocrealloc 后务必检查返回值是否为 NULL
  • 使用完毕后必须调用 free 释放内存,否则会造成内存泄漏
  • 本例仅支持 int 类型,可通过 void* 和宏实现泛型(进阶内容)。

总结

通过本教程,你已经掌握了如何用 C 语言实现一个基本的动态数组。这不仅是理解 C语言动态数组动态内存分配 的关键一步,也为后续学习更复杂的数据结构(如链表、栈、队列)打下基础。希望这篇 C语言教程 能帮助你轻松入门!

提示:动手修改代码,尝试添加删除元素、插入元素等功能,加深理解。