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

embedded/2025/3/4 13:01:21/

目录

一、引言

二、代码实现

三、代码详解

(一)头文件引入

(二)定义数组维度

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

(四)初始化二维数组

(五)输出二维数组

(六)释放内存

四、总结


一、引言

在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 等动态内存分配和释放函数。

(二)定义数组维度

cint rows = 3;int cols = 5;

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

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


 

cint** 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 类型数据的内存。如果某一行分配失败,需要释放之前已经成功分配的行的内存,再释放存储指针的数组,防止内存泄漏。

(四)初始化二维数组

cfor (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 的计算方式可以为数组元素赋予连续且有规律的值

(五)输出二维数组

cfor (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {printf("%d ", arr[i][j]);}printf("\n");}

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

(六)释放内存

cfor (int i = 0; i < rows; i++) {free(arr[i]);}free(arr);

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


四、总结

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


http://www.ppmy.cn/embedded/169915.html

相关文章

Linux系统(以Ubuntu为例)安装高版本nodejs

运行以下命令可以下载并执行 nvm&#xff08;Node Version Manager&#xff09;的安装脚本。这个命令会从 nvm 的官方GitHub仓库下载特定版本的安装脚本并执行它&#xff0c;从而在你的系统上安装 nvm。 详细步骤 打开终端&#xff1a;首先&#xff0c;打开你的终端应用程序。…

02原理篇(D2_SpringBoot 自动装配原理)

目录 一、自动装配机制 1. 简介 2. 自动装配主要依靠三个核心的关键技术 3. run()方法加载启动类 4. 注解SpringBootApplication包含了多个注解 4.1 SpringBootConfiguration 4.2 ComponentScan 4.3 EnableAutoConfiguration 5. SpringBootApplication一共做了三件事 …

数据分析与取证 网络安全技能竞赛

数据分析与取证 网络安全技能竞赛&#xff1a;新手入门指南 在网络安全的世界中&#xff0c;数据分析与取证是两个至关重要的领域。对于刚入行的小白来说&#xff0c;理解这两个领域并运用到竞赛中可能有些困难。本文将带你了解如何在“数据分析与取证 网络安全技能竞赛”中获…

ECU抽象-通信硬件抽象

通信硬件抽象模块实现了对内部和外部通信控制器的统一抽象 1.CAN模块示例 CAN接口&#xff08;CAN Interface&#xff09;&#xff1a; 这是提供给上层服务层&#xff08;如PDU路由模块、通信栈模块等&#xff09;的接口。在这一层&#xff0c;上层服务无需关注具体CAN控制器…

Android Framework startServices 流程

找到Activity它继承的Context里面就有startService函数 具体实现在ContextImpl&#xff0c;而ContextImpl则是由createBaseContextForActivity这个函数创建的&#xff0c;简单点说就是ActivityThread&#xff0c;startActivity时创建并赋予的 startService往下找就会找到一个S…

企业微信里可以使用的企业内刊制作工具,FLBOOK

如何让员工及时了解公司动态、行业资讯、学习专业知识&#xff0c;并有效沉淀企业文化&#xff1f;一份高质量的企业内刊是不可或缺的。现在让我来教你该怎么制作企业内刊吧 1.登录与上传 访问FLBOOK官网&#xff0c;注册账号后上传排版好的文档 2.选择模板 FLBOOK提供了丰富的…

Codeforces Round 1006 (Div. 3)

ABCDE略 F 感觉考的是分形。首先画图可以发现&#xff0c;从第0行开始算&#xff0c;二的整数次幂的行中间全是零&#xff0c;并且呈现倒三角的形状蔓延至下面的行而这个倒三角左边和右边的正三角和顶部的正三角完全一致。我们可以先把第n行全部赋值为1&#xff0c;然后判断哪…