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

相关文章

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

linux批量替换文件内容的实现方式

《linux批量替换文件内容的实现方式》本文总结了Linux中批量替换文件内容的几种方法,包括使用sed替换文件夹内所有文件、单个文件内容及逐行字符串,强调使用反引号和绝对路径,并分享个人经验供参考... 目录一、linux批量替换文件内容 二、替换文件内所有匹配的字符串 三、替换每一行中全部str1为st

Python实现终端清屏的几种方式详解

《Python实现终端清屏的几种方式详解》在使用Python进行终端交互式编程时,我们经常需要清空当前终端屏幕的内容,本文为大家整理了几种常见的实现方法,有需要的小伙伴可以参考下... 目录方法一:使用 `os` 模块调用系统命令方法二:使用 `subprocess` 模块执行命令方法三:打印多个换行符模拟

RabbitMQ消息总线方式刷新配置服务全过程

《RabbitMQ消息总线方式刷新配置服务全过程》SpringCloudBus通过消息总线与MQ实现微服务配置统一刷新,结合GitWebhooks自动触发更新,避免手动重启,提升效率与可靠性,适用于配... 目录前言介绍环境准备代码示例测试验证总结前言介绍在微服务架构中,为了更方便的向微服务实例广播消息,

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.