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

相关文章

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流