动态指针数组申请和释放内存_第1页
动态指针数组申请和释放内存_第2页
动态指针数组申请和释放内存_第3页
动态指针数组申请和释放内存_第4页
动态指针数组申请和释放内存_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、c语言中内存的动态分配与释放(多维动态数组构建)(2012-02-29 00:17) 标签:c 语言内存动态 分类: C/C+静态数组与动态数组静态数组比较常见,数组长度预先定义好,在整个程序中,一旦给定大小后就无法再改变长度, 静态数组自己自动负责释放占用的内存。动态数组长度可以随程序的需要而重新指定大小。动态数组由内存分配函数(malloc)从堆(heap) 上分配存储空间,只有当程序执行了分配函数后,才为其分配内存,同时由程序员自己负责释放 分配的内存(free)。为什么要使用动态数组?在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先 确定。对于这种问

2、题,用静态数组的办法很难解决。为了解决上述问题,c语言提供了一些内存 管理函数,这些内存管理函数结合指针可以按需要动态地分配内存空间,来构建动态数组,也可 把不再使用的空间回收待用,为有效地利用内存资源提供了手段。动态数组与静态数组的比较对于静态数组,其创建非常方便,使用完也无需释放,要引用也简单,但是创建后无法改变其大 小是其致命弱点!对于动态数组,其创建麻烦,使用完必须由程序员自己释放,否则严重会引起内存泄露。但其使 用非常灵活,能根据程序需要动态分配大小。如何构建动态数组?构建动态数组时,我们遵循下面的原则:申请的时候从外层往里层,逐层申请;释放的时候从里层往外层,逐层释放;构建动态数组

3、所需指针对于构建一维动态数组,需要一维指针;对于二维,则需要一维,二维指针;对于三维,需要一,二,三维指针;依此类推。动态内存分配与释放函数/*动态内存分配与释放函数*/void *malloc(unsigned int size);void *calloc(unsigned int num, unsigned int size);void *realloc(void *p,unsigned int size);void free (void *p);说明:(1)malloc()函数成功:返回所开辟空间首地址;失败:返回空指针;功能:向系统申请size字节堆的空间;calloc ()成功:返回

4、所开辟空间首地址;失败:返回空指针;功能:按类型向系统申请num个size 字节堆的空间;realloc()成功:返回所开辟空间首地址;失败:返回空指针;功能:将p指向的空间变为个size 字节堆的空间;free()没有返回值,释放p指向的堆空间;(2)规定为void *类型,这并不是说该函数调用后无返回值,而是返回一个结点的地址,该地址的 类型为void(无类型或类型不确定),即一段存储区的首址,其具体类型无法确定,只有使用时 根据各个域值数据再确定。可以用强制转换的方法将其转换为别的类型。例如:double *pd = NULL;2- pd = (double *)calloc(10, s

5、izeof(double);表示将向系统申请10个连续的double类型的存储空间,并用指针pd指向这个连续的空间的首 地址。并且用(double)对calloc ()的返回类型进行转换,以便把double类型数据的地址赋值给 指针pd。(3)使用sizeof的目的是用来计算一种类型的占有的字节数,以便适合不同的编译器。检查动态内存是否分配成功由于动态分配不一定成功,为此要附加一段异常处理程序,不致程序运行停止,使用户不知所措。通常采用这样的异常处理程序段:if (p =NULL)/* 或者 if(!p)*/2. (printf (动态申请内存失败! n);exit (1);/异常退出5. 这

6、四个函数头文件均包含在stdlib.h中。分配的堆空间是没有名字的,只能通过返回的指针找到它。绝不能对非动态分配存储块使用free。也不能对同一块内存区同时用free释放两次,如:free(p);free(p); 调用free()时,传入指针指向的内存被释放,但调用函数的指针值可能保持不变,因为p 是作为形参而传递给了函数。严格的讲,被释放的指针值是无效的,因为它已不再指向所申请的 内存区。这时对它的任何使用便可能会可带来问题。所以在释放一个指针指向的内存后,将该指 针赋值为0,避免该指针成为野指针:int*p =(int*)malloc(sizeof(int);free(p);/*释放p指向

7、内存*/p = 0;/*或者p =NULL,释放p指向的内存后,将p指针赋值为0,避免p指针成为野指针*/malloc与calloc的区别,对于用malloc分配的内存区间,如果原来没有被使用过,则其 中的每一位可能都是0;反之,如果这部分内存空间曾经被分配、释放和重新分配,则其中可能 遗留各种各样的数据。也就是说,使用malloc()函数的程序开始时(内存空间还没有被重新分配) 能正常运行,但经过一段时间后(内存空间已被重新分配)可能会出现问题,因此在使用它之前必 须先进行初始化(可用memset函数对其初始化为0),但调用calloc()函数分配到的空间在分 配时就已经被初始化为0 了。当

8、你在calloc()函数和malloc()函数之间作选择时,你需考虑是 否要初始化所分配的内存空间,从而来选择相应的函数。六.动态数组构建过程以三维整型数组为例int arrayxyz先遵循从外到里,逐层申请的原则:最外层的指针就是数组名array,他是一个三维指针,指向的是array 口,array 是二维指针, 所以给array申请内存空间需要一个三维指针int * p;1- /*给三维数组arrayxyz动态分配内存*/int* p =(int*)malloc(x * sizeof(int*);3- /*或者如下*/array = (int *)malloc(x * sizeof(int

9、 *)/*指针p指向的是array三维数组的第一维,有x个元素,所以要sizeof(x *(int*)*/次层指针是array口,它是一个二维指针,指向的是array口口,array口 口是一维指针:L int i, j;for (i = 0; i x; i+)(arrayi=(int*)malloc(y * sizeof(int*);最内层指针是array口口,它是个一维指针,所指向的是array,其是个整型常量。所以给 array口 申请内存应:L int i, j;for (i = 0; i x; i+) TOC o 1-5 h z (for(j = 0; j y; j+)(arrayi

10、j = (int*)malloc(z * sizeof(int);综合以上三步:/*动态构建三维数组内存分配函数*/* pArr:指向三维数组首地址* x:三维数组第一维元素个数* y:三维数组第二维元素个数* Z:三维数组第三维元素个数*/void Create3DActiveArray(int*pArr, int x, int y, int z)int i, j, k;pArr =(int*)malloc(x * sizeof(int*);12.for(i = 0; i x; i+) TOC o 1-5 h z pArri = (int*)malloc(y * sizeof(int*);f

11、or(j = 0; j y; j+)pArrij = (int*)malloc(z * sizeof(int);for (k = 0; k z; k+)pArrijk= i + j + k;内存释放函数:void Free3DActiveArray(int*pArr, int x, int y)int i, j, k;for(i = 0; i x; i+)for(j = 0; j y; j+)free (pArrij);pArrij= 0;free (pArri);pArr i= 0;free(pArr);15./*2012 年 2 月 29 日 12:00:32目的:多维数组构建和释放,这里

12、以构建一个动态3维数组为例*/5.#include #include 8.void Malloc3DActiveArray(int* pArr, int x, int y, int z);void Free3DActiveArray(int* pArr, int x, int y);/void Display3DArray(int* pArr, int x, int y, int z);12.13.int main(void)(16.int x, y, z;int*array=NULL;18.printf (输入一维长度:);scanf (d,&x);printf (输入二维长度:);scan

13、f (d,&y);printf (输入三维长度:);scanf (d,&z);25.Malloc3DActiveArray(array, x, y, z);Free3DActiveArray(array, x, y);array=NULL;29.return 0;32.void Malloc3DActiveArray(int* pArr,int x,int y,int z)(int i, j, k;pArr =(int*) malloc (x * sizeof (int*);37.for(i = 0; i x; i+) TOC o 1-5 h z (pArri = (int*)malloc(y

14、 * sizeof(int*);for(j = 0; j y; j+)(pArrij = (int*)malloc(z * sizeof(int);for (k = 0; k z; k+)(pArr ijk= i + j + k + 1;printf(%d , pArr ijk); TOC o 1-5 h z printf (n);printf (n);54.void Free3DActiveArray(int* pArr, int x, int y)(int i, j;for(i = 0; i x; i+)(for(j = 0; j y; j+)(free(pArrij);pArr ij=

15、0;65.free (pArri);pArr i= 0;free(pArr);/*2012 年 2 月 29 日 12:32:02功能:动态构建4维数组,学习动态构建多维数组,并释放多维数组*/5.#include #include 8.int main ()(11.int n1,n2,n3,n4;12.int*array;13.int i,j,k,m;14.puts (输入一维长度:);scanf (%d,&n1);puts (输入二维长度:);scanf (%d,&n2);puts(输入三维长度:);scanf (d,&n3);puts( 输入四维长度:);scanf (d,&n4);23

16、.array=(int*)malloc(n1 * sizeof(int*);/第一维25.for(i = 0; i n1; i+) TOC o 1-5 h z (arrayi = (int*)malloc(n2 * sizeof (int*);/第二维for(j = 0; j n2; j+)(arrayij = (int*)malloc(n3 * sizeof(int*);/第三维for (k = 0; k n3; k+)(arrayijk = (int*)malloc(n4 * sizeof(int);/第四维for(m = 0; m n4; m+)(arrayijkm= i + j + k + m + 1;printf (%dt, arrayijkm);printf (n);printf (n);printf (n);46.47.for(i=0;in1;i+)48. (49.for(j= 0;jn2;j+)50. (51. for (k= 0;kn3;k+) TOC o 1-5 h z (free(arrayijk);/释放第四维指针arrayijk= 0;56.free(array

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论