什么是动态数组?

动态数组是相对于静态数组而言的,从“动”字可以看出它的灵活性。静态数组的长度是预先定义好的,在整个程序中,一旦给定数组大小后就无法改变。而动态数组则不然,它可以根据程序需要重新指定数组大小。动态数组的内存空间是由堆动态分配的,通过执行代码为其分配存储空间,只有程序执行到分配语句时,才为其分配存储空间。

动态数组和一般数组(静态数组)的区别

  • 静态数组:创建非常方便,使用完也无需释放,引用起来也简单,但是创建后无法改变数组大小是其致命的弱点。
  • 动态数组:创建麻烦,使用完必须由程序员自己释放,否则会引起内存泄露,但是其使用非常灵活,能根据程序需要动态分配大小。

动态数组的创建和使用

在创建动态数组的过程中要遵循一个原则,那就是从外层向里层逐层创建,从里层向外层逐层释放。如果要创建一个N维的动态数组,那么要从第一维开始创建,直到第N维为止;而释放时与创建时相反,即从第N维开始释放,直到第一维为止。下面我们一起来看看一维动态数组和二维动态数组。

一维动态数组

  • 创建形式

类型说明符* 数组名 = (类型说明符*)malloc(数组长度*sizeof(类型说明符))

  • 实例
//
// Created by 冲哥 on 2022/11/26.
// 微信关注【C语言中文社区】,免费领取500G学习资料
//
#include<stdio.h>
#include<stdlib.h>

int main() {
    int n; //用来接收要创建的一维动态数组的长度
    int *arr;
    printf("请输入所要创建的一维动态数组的长度:");
    scanf("%d", &n);
    if ((arr = (int *) malloc(sizeof(int) * n)) == NULL) { //使用malloc来动态分配内存
        printf("分配内存空间失败!\n");//如果内存分配失败,报错异常退出
        return -1;
    }
    for (int i = 0; i < n; i++) { //通过循环给数组赋值并在控制台进行打印
        arr[i] = i + 1;
        printf("%d\t", arr[i]);
    }
    free(arr); //释放内存空间

    return 0;
}
  • 运行结果
请输入所要创建的一维动态数组的长度:8
1    2       3       4       5       6       7       8

二维动态数组

  • 创建形式
类型说明符** 数组名 = (类型说明符**)malloc(第一维长度*sizeof(类型说明符*))
for(int  i=0;i<第一维长度;i++){
    数组名[i]=(类型说明符*)malloc(第二维长度*sizeof(类型说明符))
}
  • 实例
//
// Created by 冲哥 on 2022/11/26.
// 微信关注【C语言中文社区】,免费领取500G学习资料
//
#include<stdio.h>
#include<stdlib.h>

int main() {
    int n1, n2;
    int **arr;
    printf("请输入所要创建的动态数组的第一维长度:");
    scanf("%d", &n1);
    printf("请输入所要创建的动态数组的第二维长度:");
    scanf("%d", &n2);

    if ((arr = (int **) malloc(n1 * sizeof(int *))) == NULL)//使用malloc给第一维分配内存
    {
        printf("分配内存空间失败!\n");//如果内存分配失败,报错异常退出
        return -1;
    }

    for (int i = 0; i < n1; i++) {
        if ((arr[i] = (int *) malloc(n2 * sizeof(int))) == NULL)//使用malloc给第二维分配内存
        {
            printf("分配内存空间失败!\n");//如果内存分配失败,报错异常退出
            return -1;
        }
    }
    for (int i = 0; i < n1; i++) { //通过循环给数组赋值并在控制台进行打印
        for (int j = 0; j < n2; j++) {
            arr[i][j] = i * n2 + j + 1;
            printf("%d\t", arr[i][j]);
        }
        printf("\n");
    }
    for (int i = 0; i < n1; i++) {
        free(arr[i]);//释放第二维
    }
    free(arr);//释放第一维

    return 0;
}
  • 运行结果
请输入所要创建的动态数组的第一维长度:5
请输入所要创建的动态数组的第二维长度:4
1       2       3       4
5       6       7       8
9       10      11      12
13      14      15      16
17      18      19      20

代码中的注释已经写的很详细了,如果还有什么疑问欢迎评论区留言。
如果您觉得本篇文章对您有帮助,请点赞,转发给更多的人。