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

原创 2013年12月03日 08:41:59

   在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语言 二维数组(指针)动态分配和释放

C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据。如果我们将总长128位的指令分...

C语言中动态分配二维数组

转自:http://tsindahui.blog.sohu.com/84512010.html 在C中动态分配内存的,对于单个变量,字符串,一维数组等,都是很容易的。C中动态分配二维数组的方法,...

定义一个动态的二维数组?

在C++中实现变长数组             1.变长一维数组         这里说的变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组。实现变长数组最简单的是变长一维数...

C语言 字符串指针与二维字符串数组

31.字符串指针 char *str = "hello world";    //hello world这个字符串存储在常量区,str只保存了字符串常量的首地址 字符串指针变量的定义说明与指向字符...

C++建立动态二维数组

C++建立动态二维数组主要有两种方法: 1.使用数组指针,分配一个指针数组,将其首地址保存在b中,然后再为指针数组的每个元素分配一个数组                           int...

C/C++面试之算法系列--二维动态数组定义及二维静态数组与**P的区别

  二维动态数组定义及二维静态数组与**P的区别 Sailor_forever  sailing_9806@163.com 转载请注明http://blog.csdn.net/sailor_8318/...

C/C++ 二维动态数组的分配和赋值

平台:Visual Studio 2013 近期找工作中,错过了阿里和腾讯的笔试,百度的笔试也让我措手不及。还好有个赛码网能让我练练在线笔试题。 最近笔试题总是会调试不出来,主要是存在着输入...

多维数组的动态分配

方法一:内存不连续 假设数组元素的数据类型是int型,则动态分配二维数组的一般方法是这样:     int **p = NULL;      p = (int **)malloc(n...

C++中关于一维、二维、三维动态数组的定义

定长数组我们在这里就不讨论了,想要知道如何定义定长数组的童鞋麻烦出门直走前面左转~ 一、什么是动态数组 也就是在编译时无法确定数组长度,程序在运行时需要动态分配内存空间的数组,比如需要根据输入(cin...

关于动态内存分配和数组的选用(变长选malloc,定长选数组)

1:当变量长度是变长的时候,最好使用动态内存分配。 否则,用数组申请,小了,不够用。大了,浪费空间。 2:当变量长度是定长的时候,最好使用数组来申请连续空间的内存。 动态内存也可以,但会浪费堆...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言两种动态分配二维数组方式的讨论
举报原因:
原因补充:

(最多只允许输入30个字)