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 logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

SpringValidation数据校验之约束注解与分组校验方式

《SpringValidation数据校验之约束注解与分组校验方式》本文将深入探讨SpringValidation的核心功能,帮助开发者掌握约束注解的使用技巧和分组校验的高级应用,从而构建更加健壮和可... 目录引言一、Spring Validation基础架构1.1 jsR-380标准与Spring整合1

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

Spring中配置ContextLoaderListener方式

《Spring中配置ContextLoaderListener方式》:本文主要介绍Spring中配置ContextLoaderListener方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录Spring中配置ContextLoaderLishttp://www.chinasem.cntene

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印