在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用静态数组的办法很难解决。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数结合指针可以按需要动态地分配内存空间,来构建动态数组,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。

动态数组,是相对于静态数组而言。静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就无法改变。而动态数组则不然,它可以随程序需要而重新指定大小。动态数组的内存空间是从堆(heap)上分配(即动态分配)的。是通过执行代码而为其分配存储空间。当程序执行到这些语句时c#byte数组,才为其分配。程序员自己负责释放内存。

为什么要使用动态数组?

在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题c#byte数组,用静态数组的办法很难解决。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数结合指针可以按需要动态地分配内存空间,来构建动态数组,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。

动态数组与静态数组的对比

对于静态数组,其创建非常方便,使用完也无需释放,要引用也简单,但是创建后无法改变其大小是其致命弱点!

对于动态数组,其创建麻烦,使用完必须由程序员自己释放,否则严重会引起内存泄露。但其使用非常灵活,能根据程序需要动态分配大小。

如何构建动态数组

遵循原则

申请的时候从外层往里层,逐层申请;

释放的时候从里层往外层,逐层释放。

构建所需指针

对于构建一维动态数组,需要一维指针;

对于二维,则需要一维,二维指针;

三维需要一,二,三维指针;

依此类推。

构建所需函数

函数原型返 回功能说明void *malloc(unsigned int size);成功:返回所开辟 空间首地址 失败:返回空指针向系统申请 size字节的 堆空间void *calloc(unsigned int num, unsigned int size);成功:返回所开辟 空间首地址 失败:返回空指针按类型申请 num个size字 节的堆空间void free(void *p);无返回值释放p指向 的堆空间void *realloc(void *p,unsigned int size);成功:返回新开辟 空间首地址 失败:返回空指针将p指向的 堆空间变为 size

说明:

malloc与calloc的区别

对于用malloc分配的内存区间,如果原来没有被使用过,则其中的每一位可能都是0;反之, 如果这部分内存空间曾经被分配、释放和重新分配,则其中可能遗留各种各样的数据。也就是说, 使用malloc()函数的程序开始时(内存空间还没有被重新分配)能正常运行,但经过一段时间后(内 存空间已被重新分配)可能会出现问题,因此在使用它之前必须先进行初始化(可用memset函数 对其初始化为0),但调用calloc()函数分配到的空间在分配时就已经被初始化为0了。 当你在calloc()函数和malloc()函数之间作选择时,你需考虑是否要初始化所分配的内存空 间,从而来选择相应的函数。

具体构建方法

以三维整型数组array[n1][n2][n3]为例。

先遵循从外层到里层,逐层申请的原则:

最外层指针是array,它是个三维指针,所指向的是array[],其为二维指针。所以给array

申请内存应:

array=(int***)calloc(n1,sizeof(int**));

次层指针是array[],它是个二维指针,所指向的是array[][],其为一维指针。所以给array[]

申请内存应:

for(i=0;i<n1;i++)
{
 array[i]=(int**)calloc(n2,sizeof(int*));
}

最内层指针是array[][],它是个一维指针,所指向的是array[][][],其是个整型常量。所以给array[][]申请内存应:

for(i=0;i<n1;i++)
{
 for(j=0;j<n2;j++)
 {
 array[i][j]=(int*)calloc(n3,sizeof(int));
 }
}

当然,你可以把它们整合在一起为:

int i,j,k;
int n1,n2,n3;
int ***array;
scanf("%d%d%d",&n1,&n2,&n3);
array=(int***)calloc(n1,sizeof(int**));
for(i=0;i<n1;i++)
{
 array[i]=(int**)calloc(n2,sizeof(int*));
 for(j=0;j<n2;j++)
 {
 array[i][j]=(int*)calloc(n3,sizeof(int));
 for(k=0;k<n3;k++)
 {
 array[i][j][k]=i+j+k+1;
 }
 }
}

最后不要忘了释放这些内存,这要遵循释放的时候从里层往外层,逐层释放的原则。

分析过程可参考上面的解答,这里不再赘述。只给出代码吧:

for(i=0;i<n1;i++)
{
 for(j=0;j<n2;j++)
 {
 free(array[i][j]);//释放第三维指针
 }
}
for(i=0;i<n1;i++)
{
 free(array[i]);//释放第二维指针
}
free(array);//释放第一维指针

其余维的如四维创建过程大同小异,这里不再赘述。

c byte数组查找_char数组转byte数组 c#_c#byte数组

限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: muyang-0410