使用 malloc 函数创建和操作二维整型数组

发布于:2025-03-04 ⋅ 阅读:(106) ⋅ 点赞:(0)

目录

一、引言

二、代码实现

三、代码详解

(一)头文件引入

(二)定义数组维度

(三)动态分配二维数组内存

(四)初始化二维数组

(五)输出二维数组

(六)释放内存

四、总结


一、引言

在C语言编程中,动态内存分配是一项非常重要的技能。它允许我们在程序运行时根据实际需求分配内存,提高内存使用效率。 malloc 函数是C语言中用于动态内存分配的重要工具之一。本文将详细介绍如何使用 malloc 函数模拟开辟一个 3*5 的整型二维数组并对其进行初始化和访问,最后释放所分配的内存。


二、代码实现


 

c

#include <stdio.h>

#include <stdlib.h>



int main() {

    int rows = 3;

    int cols = 5;

    // 动态分配二维数组的内存

    int** arr = (int**)malloc(rows * sizeof(int*));

    if (arr == NULL) {

        perror("malloc for rows");

        return 1;

    }

    for (int i = 0; i < rows; i++) {

        arr[i] = (int*)malloc(cols * sizeof(int));

        if (arr[i] == NULL) {

            // 如果某一行分配失败,释放之前已分配的行

            for (int j = 0; j < i; j++) {

                free(arr[j]);

            }

            free(arr);

            perror("malloc for cols");

            return 1;

        }

    }



    // 使用下标访问形式初始化二维数组

    for (int i = 0; i < rows; i++) {

        for (int j = 0; j < cols; j++) {

            arr[i][j] = i * cols + j;

        }

    }



    // 使用下标访问形式输出二维数组

    for (int i = 0; i < rows; i++) {

        for (int j = 0; j < cols; j++) {

            printf("%d ", arr[i][j]);

        }

        printf("\n");

    }



    // 释放动态分配的内存

    for (int i = 0; i < rows; i++) {

        free(arr[i]);

    }

    free(arr);



    return 0;

}




三、代码详解

(一)头文件引入

c

#include <stdio.h>

#include <stdlib.h>

 stdio.h 头文件包含了标准输入输出函数,如 printf ,用于在控制台输出数组内容。 stdlib.h 头文件则包含了 malloc 和 free 等动态内存分配和释放函数。

(二)定义数组维度

c

int rows = 3;

int cols = 5;

这里定义了二维数组的行数 rows 为 3 ,列数 cols 为 5 ,表示我们要创建一个 3*5 的二维数组。

(三)动态分配二维数组内存


 

c

int** arr = (int**)malloc(rows * sizeof(int*));

if (arr == NULL) {

    perror("malloc for rows");

    return 1;

}

for (int i = 0; i < rows; i++) {

    arr[i] = (int*)malloc(cols * sizeof(int));

    if (arr[i] == NULL) {

        // 如果某一行分配失败,释放之前已分配的行

        for (int j = 0; j < i; j++) {

            free(arr[j]);

        }

        free(arr);

        perror("malloc for cols");

        return 1;

    }

}



首先, (int**)malloc(rows * sizeof(int*)) 用于分配一个指针数组,数组的每个元素是一个指向 int 类型的指针,用于存储二维数组每一行的首地址。如果分配失败, malloc 函数会返回 NULL ,通过 perror 函数输出错误信息并终止程序。

然后,通过循环为每一行分配具体的内存空间, arr[i] = (int*)malloc(cols * sizeof(int)) 为第 i 行分配能存储 cols 个 int 类型数据的内存。如果某一行分配失败,需要释放之前已经成功分配的行的内存,再释放存储指针的数组,防止内存泄漏。

(四)初始化二维数组

c

for (int i = 0; i < rows; i++) {

    for (int j = 0; j < cols; j++) {

        arr[i][j] = i * cols + j;

    }

}

这里使用两层嵌套循环,通过 arr[i][j] 的形式对二维数组进行初始化。 i * cols + j 的计算方式可以为数组元素赋予连续且有规律的值

(五)输出二维数组

c

for (int i = 0; i < rows; i++) {

    for (int j = 0; j < cols; j++) {

        printf("%d ", arr[i][j]);

    }

    printf("\n");

}

同样使用两层嵌套循环,通过 arr[i][j] 的形式输出二维数组的每个元素,每输出完一行就换行,方便查看结果。

(六)释放内存

c

for (int i = 0; i < rows; i++) {

    free(arr[i]);

}

free(arr);

动态分配的内存使用完毕后必须释放,否则会造成内存泄漏。这里先释放每一行的内存,再释放存储指针的数组,确保所有动态分配的内存都被正确释放。


四、总结

通过本文的介绍,我们了解了如何使用 malloc 函数动态创建一个二维整型数组,并对其进行初始化、访问和内存释放的完整过程。动态内存分配在处理复杂数据结构和不确定大小的数据时非常有用,但同时也需要注意内存的正确管理,避免内存泄漏和非法访问等问题。掌握这些知识,将有助于我们编写出更高效、健壮的C语言程序。


网站公告

今日签到

点亮在社区的每一天
去签到