C 语言本身没有内建的多维数组动态分配的直接支持,但可以使用 指针数组 和 malloc() / calloc() 函数来动态地分配内存。通过 malloc() 和 free() 函数,C 语言提供了对动态数组的强大支持,能够根据需要灵活地分配和释放内存。

1、为二维数组分配内存

动态分配二维数组的内存可以通过使用指针和 malloc 函数来实现。这里有两种常见的方式:一种是为每一行分别分配内存,另一种是一次性为整个数组分配内存。

1)为每一行分配内存

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

int main() {
    int rows = 3; // 行数
    int cols = 4; // 列数

    // 动态分配二维数组
    int **array = (int **)malloc(rows * sizeof(int *));
    for (int i = 0; i < rows; i++) {
        array[i] = (int *)malloc(cols * sizeof(int));
    }

    // 给数组赋值
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            array[i][j] = i * cols + j;
        }
    }

    // 输出数组内容
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }

    // 释放内存
    for (int i = 0; i < rows; i++) {
        free(array[i]);
    }
    free(array);

    return 0;
}

2)一次性为整个二维数组分配内存

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

int main() {
    int rows = 3; // 行数
    int cols = 4; // 列数

    // 动态分配二维数组
    int *array = (int *)malloc(rows * cols * sizeof(int));

    // 给数组赋值
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            array[i * cols + j] = i * cols + j;
        }
    }

    // 输出数组内容
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", array[i * cols + j]);
        }
        printf("\n");
    }

    // 释放内存
    free(array);

    return 0;
}

2、为三维数组分配内存

对于三维数组,我们也可以采用类似的方法。三维数组的内存分配较为复杂,但原理是相同的。

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

int main() {
    int x = 2, y = 3, z = 4;
    int i, j, k;

    // 为三维数组分配内存
    int ***array = (int ***)malloc(x * sizeof(int **));
    if (array == NULL) {
        printf("Memory allocation failed for first dimension\n");
        return 1;
    }

    // 为每层分配内存
    for (i = 0; i < x; i++) {
        array[i] = (int **)malloc(y * sizeof(int *));
        if (array[i] == NULL) {
            printf("Memory allocation failed for second dimension\n");
            return 1;
        }

        // 为每行分配内存
        for (j = 0; j < y; j++) {
            array[i][j] = (int *)malloc(z * sizeof(int));
            if (array[i][j] == NULL) {
                printf("Memory allocation failed for third dimension\n");
                return 1;
            }
        }
    }

    // 初始化并打印三维数组
    for (i = 0; i < x; i++) {
        for (j = 0; j < y; j++) {
            for (k = 0; k < z; k++) {
                array[i][j][k] = i * y * z + j * z + k;  // 填充示例数据
                printf("array[%d][%d][%d] = %d\n", i, j, k, array[i][j][k]);
            }
        }
    }

    // 释放内存
    for (i = 0; i < x; i++) {
        for (j = 0; j < y; j++) {
            free(array[i][j]);
        }
        free(array[i]);
    }
    free(array);

    return 0;
}

3、使用单一内存块

另一种常见的动态分配多维数组的方式是通过分配一个单一的内存块,并使用指针进行偏移。此方法通常更高效,因为它减少了分配和释放内存时的复杂性。

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

int main() {
    int m = 3, n = 4;
    int i, j;

    // 为二维数组分配一个单一内存块
    int *array = (int *)malloc(m * n * sizeof(int));
    if (array == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }

    // 使用数组的偏移量模拟二维数组
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            array[i * n + j] = i * n + j;  // 填充数据
            printf("%d ", array[i * n + j]);
        }
        printf("\n");
    }

    // 释放内存
    free(array);

    return 0;
}

推荐文档