《动态内存分配.ppt》由会员分享,可在线阅读,更多相关《动态内存分配.ppt(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、动态内存分配 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望2 2、动态内存分配、动态内存分配、动态内存分配、动态内存分配 所谓动态内存分配是指在程序运行过程中,所谓动态内存分配是指在程序运行过程中,所谓动态内存分配是指在程序运行过程中,所谓动态内存分配是指在程序运行过程中,根据程序的实根据程序的实根据程序的实根据程序的实际需要来分配一块大小合适的连续的内存单元际需要来分配一块大小合适的连续的内存单元际需要来分配一块大小合适的连续的内存单元际需要来分配一块大小合适
2、的连续的内存单元。程序可以动态分配一个数组,也可以动态分配其它类型的程序可以动态分配一个数组,也可以动态分配其它类型的程序可以动态分配一个数组,也可以动态分配其它类型的程序可以动态分配一个数组,也可以动态分配其它类型的数据单元。动态分配的内存需要有一个数据单元。动态分配的内存需要有一个数据单元。动态分配的内存需要有一个数据单元。动态分配的内存需要有一个指针变量指针变量指针变量指针变量记录内存的起始记录内存的起始记录内存的起始记录内存的起始地址。地址。地址。地址。C C语言中动态内存分配其实就是使用一个标准的库函数语言中动态内存分配其实就是使用一个标准的库函数语言中动态内存分配其实就是使用一个标
3、准的库函数语言中动态内存分配其实就是使用一个标准的库函数mallocmalloc,其函数的原型为:,其函数的原型为:,其函数的原型为:,其函数的原型为:void *malloc(unsigned int size);void *malloc(unsigned int size);说明:说明:说明:说明:sizesize这个参数的含义是分配的内存的大小(以这个参数的含义是分配的内存的大小(以这个参数的含义是分配的内存的大小(以这个参数的含义是分配的内存的大小(以字节字节字节字节为单位)。为单位)。为单位)。为单位)。返回值:失败,则返回值是返回值:失败,则返回值是返回值:失败,则返回值是返回值:
4、失败,则返回值是NULLNULL(空指针)。(空指针)。(空指针)。(空指针)。成功,则返回值是一个指向空类型(成功,则返回值是一个指向空类型(成功,则返回值是一个指向空类型(成功,则返回值是一个指向空类型(voidvoid)的指针)的指针)的指针)的指针 (即所分配内存块的首地址)。(即所分配内存块的首地址)。(即所分配内存块的首地址)。(即所分配内存块的首地址)。语语言言程程序序设设计计静静态态内内存存分分配配和和动动态态内内存存分分配配Csizeof运算符sizeofsizeofsizeofsizeof运算符运算符运算符运算符 功能:功能:功能:功能:获取变量和数据类型所占内存大小(字节
5、数)获取变量和数据类型所占内存大小(字节数)获取变量和数据类型所占内存大小(字节数)获取变量和数据类型所占内存大小(字节数)格式:格式:格式:格式:sizeof sizeof sizeof sizeof 表达式表达式表达式表达式sizeofsizeofsizeofsizeof(数据类型名或表达式)(数据类型名或表达式)(数据类型名或表达式)(数据类型名或表达式)例:例:例:例:sizeof(int)sizeof(int)其值为其值为其值为其值为2 2 2 2(在(在(在(在TC2.0TC2.0TC2.0TC2.0或或或或BC3.1BC3.1BC3.1BC3.1下)下)下)下)其值为其值为其值为
6、其值为4 4 4 4(在在在在VC6.0VC6.0VC6.0VC6.0下)下)下)下)sizeof(long)sizeof(long)其值是其值是其值是其值是4 4 4 4 sizeof(10L)其值也是其值也是4 4 unsigned long a=2;sizeof(a)其值也是其值也是4 4 语语言言程程序序设设计计静静态态内内存存分分配配和和动动态态内内存存分分配配C2 2、动态内存分配、动态内存分配、动态内存分配、动态内存分配 int n,*pscore;int n,*pscore;scanf(%d,&n);scanf(%d,&n);/分配分配分配分配n n个连续的整型单元,首地址赋给
7、个连续的整型单元,首地址赋给个连续的整型单元,首地址赋给个连续的整型单元,首地址赋给pscorepscorepscore=(int*)malloc(n*sizeof(int);pscore=(int*)malloc(n*sizeof(int);/分配内存失败,则给出错误信息后退出分配内存失败,则给出错误信息后退出分配内存失败,则给出错误信息后退出分配内存失败,则给出错误信息后退出if(pscore=NULL)if(pscore=NULL)printf(Insufficient memory available!);printf(Insufficient memory available!);e
8、xit(0);exit(0);/可对可对可对可对pscorepscore所指向的单元进行其它处理所指向的单元进行其它处理所指向的单元进行其它处理所指向的单元进行其它处理 例如:根据学生人数来建立数组的问题可以用动态内存分例如:根据学生人数来建立数组的问题可以用动态内存分例如:根据学生人数来建立数组的问题可以用动态内存分例如:根据学生人数来建立数组的问题可以用动态内存分配来解决,其方法如下配来解决,其方法如下配来解决,其方法如下配来解决,其方法如下:动态分配的动态分配的动态分配的动态分配的内存块内存块内存块内存块01000100pscorepscore 0100 0100 共共共共n*sizeo
9、f(int)n*sizeof(int)个个个个字节内存单元字节内存单元字节内存单元字节内存单元语语言言程程序序设设计计静静态态内内存存分分配配和和动动态态内内存存分分配配C关于关于关于关于mallocmalloc的使用有几点需强调一下:的使用有几点需强调一下:的使用有几点需强调一下:的使用有几点需强调一下:mallocmalloc前面必须要加上一个指针类型转换符,如前面的前面必须要加上一个指针类型转换符,如前面的前面必须要加上一个指针类型转换符,如前面的前面必须要加上一个指针类型转换符,如前面的(int(int*)*)。因为。因为。因为。因为mallocmalloc的返回值是空类型的指针,一般
10、应与右边的的返回值是空类型的指针,一般应与右边的的返回值是空类型的指针,一般应与右边的的返回值是空类型的指针,一般应与右边的指针变量类型一致。指针变量类型一致。指针变量类型一致。指针变量类型一致。mallocmalloc所带的一个参数是指需分配的内存单元所带的一个参数是指需分配的内存单元所带的一个参数是指需分配的内存单元所带的一个参数是指需分配的内存单元字节数字节数字节数字节数,尽管,尽管,尽管,尽管可以直接用数字来表示,但一般写成如下形式:可以直接用数字来表示,但一般写成如下形式:可以直接用数字来表示,但一般写成如下形式:可以直接用数字来表示,但一般写成如下形式:分配数量分配数量分配数量分配
11、数量*sizeof(*sizeof(内存单元类型符内存单元类型符内存单元类型符内存单元类型符)mallocmalloc可能返回可能返回可能返回可能返回NULLNULL,表示分配内存失败,因此一定要,表示分配内存失败,因此一定要,表示分配内存失败,因此一定要,表示分配内存失败,因此一定要检检检检查分配的内存指针是否为空查分配的内存指针是否为空查分配的内存指针是否为空查分配的内存指针是否为空,如果是空指针,则不能引用这,如果是空指针,则不能引用这,如果是空指针,则不能引用这,如果是空指针,则不能引用这个指针,否则会造成系统崩溃。所以在动态内存分配的语句个指针,否则会造成系统崩溃。所以在动态内存分配
12、的语句个指针,否则会造成系统崩溃。所以在动态内存分配的语句个指针,否则会造成系统崩溃。所以在动态内存分配的语句的后面一般紧跟一条的后面一般紧跟一条的后面一般紧跟一条的后面一般紧跟一条if if语句以判断分配是否成功。语句以判断分配是否成功。语句以判断分配是否成功。语句以判断分配是否成功。3 3、动态内存释放、动态内存释放、动态内存释放、动态内存释放 计算机中最宝贵的资源就是内存。因此需要动态分配内计算机中最宝贵的资源就是内存。因此需要动态分配内计算机中最宝贵的资源就是内存。因此需要动态分配内计算机中最宝贵的资源就是内存。因此需要动态分配内存的程序一定要坚持存的程序一定要坚持存的程序一定要坚持存
13、的程序一定要坚持“好借好还,再借不难好借好还,再借不难好借好还,再借不难好借好还,再借不难”的原则。的原则。的原则。的原则。释放动态内存的函数释放动态内存的函数释放动态内存的函数释放动态内存的函数freefree其原型为:其原型为:其原型为:其原型为:void free(void*block);void free(void*block);例:例:例:例:freefree(pscore);(pscore);注意:注意:注意:注意:调用调用调用调用mallocmalloc和和和和freefree函数的源程序中要包含函数的源程序中要包含函数的源程序中要包含函数的源程序中要包含stdlib.hstdl
14、ib.h或或或或malloc.hmalloc.h或或或或alloc.halloc.h(在(在(在(在TCTC、BCBC下)。下)。下)。下)。mallocmalloc和和和和freefree一般成对出一般成对出一般成对出一般成对出现!现!现!现!语语言言程程序序设设计计静静态态内内存存分分配配和和动动态态内内存存分分配配C【例】【例】【例】【例】编写程序先输入学生人数,然后输入学生成绩,最后编写程序先输入学生人数,然后输入学生成绩,最后编写程序先输入学生人数,然后输入学生成绩,最后编写程序先输入学生人数,然后输入学生成绩,最后输出学生的平均成绩、最高成绩和最低成绩输出学生的平均成绩、最高成绩和
15、最低成绩输出学生的平均成绩、最高成绩和最低成绩输出学生的平均成绩、最高成绩和最低成绩。#include#include#include#include#include#include void main()void main()int num,i;int num,i;int maxscore,minscore,sumscore;int maxscore,minscore,sumscore;int*pscore;int*pscore;float averscore;float averscore;printf(input the number of student:);printf(input
16、the number of student:);scanf(%d,&num);scanf(%d,&num);if(num=0)if(num=0)return;return;pscore=(int*)malloc(num*sizeof(int);pscore=(int*)malloc(num*sizeof(int);if(pscore=NULL)if(pscore=NULL)printf(Insufficient memory availablen);printf(Insufficient memory availablen);exit(0);exit(0);printf(input the s
17、cores of students now:n);printf(input the scores of students now:n);for(i=0;i num;i+)for(i=0;i num;i+)scanf(%d,pscore+i);scanf(%d,pscore+i);maxscore=pscore0;maxscore=pscore0;minscore=pscore0;minscore=pscore0;sumscore=pscore0;sumscore=pscore0;for(i=1;i num;i+)for(i=1;i maxscore)if(pscorei maxscore)ma
18、xscore=pscorei;maxscore=pscorei;if(pscorei minscore)if(pscorei minscore)minscore=pscorei;minscore=pscorei;sumscore=sumscore+pscorei;sumscore=sumscore+pscorei;averscore=(float)sumscore/num;averscore=(float)sumscore/num;printf(-n);printf(-n);printf(the average score of the students is%.1fn,printf(the
19、average score of the students is%.1fn,averscore);averscore);printf(the highest score of the students is%dn,printf(the highest score of the students is%dn,maxscore);maxscore);printf(the lowest score of the students is%dn,printf(the lowest score of the students is%dn,minscore);minscore);free(pscore);f
20、ree(pscore);/释放动态分配的内存释放动态分配的内存释放动态分配的内存释放动态分配的内存 运行结果:运行结果:运行结果:运行结果:input the number of student:4input the scores of students now:45 76 88 94-the average score of the students is 75.8the highest score of the students is 94the lowest score of the students is 45语语言言程程序序设设计计静静态态内内存存分分配配和和动动态态内内存存分分配配C