C语言两种动态分配二维数组方式的讨论

2024-08-21 07:08

本文主要是介绍C语言两种动态分配二维数组方式的讨论,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

   在c语言中,常常有这种情况,需要动态分配一个根据实际需求情况的不确定大小的二维数组。在这种情况下,常常以存放元素数据类型为字符串的一维数组(即存放元素数据 类型为字符类型的二维数组)。例如存放10个学生的名字,一般可以简单定义这样一个二维数组char nameArray[10][30]。但是如果学生的个数不确定,再采用这种类型的声明,声明一个固定大小的二维数组,这种情况下需要定义一个足够大的二维数组,来祈求用户输入千万不能超过数组大小,同时也浪费空间。如果采用动态分配,有用户输入数组的大小,来动态分配二维数组就不会存在这个问题。下面说一下两种分配方式:

第一种:一次分配一个10*30char空间

char (*nameArray)[30]=(char (*)[30])malloc(10*sizeof(char [30]));

  内存图是这样的:

 

也就是分配10个内存为30个字符大小的内存块

第二种:先分配一个数组数据类型为指针的数组,然后再分配10个指向30个字符内存块,分别用指针数组的元素指向它。代码如下:

char **nameArray=(char **)malloc(10 *sizeof(char *));

for(int i=0;i<10;i++)

nameArray[i]=(char *)malloc(30*sizeof(char));

内存分配是这样的。

 

两种情况下,第一种适合于分配的二维数组每行的元素个数是相同的,并且确定知道的每行元素的个数,第二行比着第一行比较自由,每一行元素的个数可以不同,但是数据访问的速度比着第一行比较慢,数据量小的时候不明显。从某种意义上来说,第一种更符合标准的语言中二维数组的定义和分配方式,但是理解着可能有一定的难度,可以这样理解,理解为是数组元素是一个存储30char大小的一维数组的类型的一维数组,这句话比较绕,具体说就是把一个30char大小的一维数组定义为一个数据类型,程序化来说可以这样:

typedef struct  arrayItem{

char charItem[30];

} arrayItem;

arrayItem nameArray[10];

这样也就比较容易理解了。第二种分配是分配一种锯齿数组,虽然某种意义上可能数据访问速度稍微慢一些,但是空间相对来说比较节省一点,也可以说是牺牲时间节省空间。两种分配方式下,都能通过[]来取数组元素的值,大家可以试一试,在c语言中,不要过度区分*[]的区分方式,虽然有区别,但是在数组方面,两者的取值方式是近乎相同的。

 

这篇关于C语言两种动态分配二维数组方式的讨论的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092469

相关文章

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作