📜  C 动态数组 (1)

📅  最后修改于: 2023-12-03 15:29:44.587000             🧑  作者: Mango

C动态数组

C数组是一种可存储相同类型数据项的集合。但是,一旦数组被声明和初始化,它的大小就不可更改。这时,我们可以借助动态内存分配机制来创建大小可变的数组——动态数组。

动态内存分配

C语言提供了两个函数来进行动态内存分配:malloc()和calloc()。它们都可以在堆上分配一块指定大小的内存空间,并返回分配空间的地址。

void* malloc(size_t size);
void* calloc(size_t num, size_t size);
  • 参数size表示需要分配的字节数,num表示分配数组的元素个数,size表示每个元素的字节数
  • 返回值是一个void *指针,指向分配空间的首地址
动态数组的实现

借助malloc()/calloc()函数,我们可以在程序运行时动态地分配数组的空间。首先,我们利用指针变量p指向malloc()/calloc()函数分配的内存空间。随后,利用p指针操作真正存储数据的空间。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n = 5; // 数组长度
    int *p = (int*)malloc(n * sizeof(int)); // 分配空间
    p[0] = 1;
    p[1] = 2;
    p[2] = 3;
    p[3] = 4;
    p[4] = 5; // 操作空间
    for (int i = 0; i < n; i++) {
        printf("%d ", p[i]);
    }
    printf("\n");
    free(p); // 释放空间
    return 0;
}

注意事项:

  • 在malloc()/calloc()分配空间之后,要及时释放空间,以免出现内存泄漏的问题。使用free()函数可以释放之前分配的空间。
  • 建议使用calloc()分配数组空间,可以直接初始化分配的空间,避免出现未初始化的问题。
动态数组的扩展

动态数组的最大好处在于可以在程序运行时扩展数组的空间大小。当使用malloc()/calloc()分配空间时,可以通过realloc()函数重新调整动态数组的大小。

void* realloc(void* ptr, size_t size);
  • 参数ptr是之前malloc()/calloc()返回的指针,size为新分配空间的字节数
  • 返回值是一个void*指针,指向调整大小之后的新空间,原有空间的内容会被复制到新的空间中
#include <stdio.h>
#include <stdlib.h>

int main() {
    int n = 5; // 数组长度
    int *p = (int*)malloc(n * sizeof(int)); // 分配空间
    p[0] = 1;
    p[1] = 2;
    p[2] = 3;
    p[3] = 4;
    p[4] = 5; // 操作空间
    int *q = (int*)realloc(p, 10*sizeof(int)); // 扩展空间
    q[5] = 6;
    q[6] = 7;
    q[7] = 8;
    q[8] = 9;
    q[9] = 10; // 操作新空间
    for (int i = 0; i < 10; i++) {
        printf("%d ", q[i]);
    }
    printf("\n");
    free(q); // 释放空间
    return 0;
}

注意事项:

  • realloc()函数的第一个参数指向的是之前malloc()/calloc()返回的指针变量,而不是NULL。
  • 在调用realloc()函数后,如果返回值不是原有指针,我们需要将之前的指针p指向返回的新指针q。
总结

动态数组是C语言中非常实用的一种数据结构,能够解决数组空间固定不足以存储所有数据的问题。借助malloc()/calloc()和realloc()函数,我们可以自由地分配和调整数组的大小,提高程序的灵活性和扩展性。