7.3.2 内存的动态分配
在C语言程序中,当定义任何一个类型数据对象时,程序都会自动分配足够的内存空间来存储这些数据,特别在处理较多的数据时,通常使用数组。数组具有静态性,必须在程序编译前确定数组的大小,不能在程序运行时根据数据的实际多少来确定数组的大小,那样往往造成内存资源的浪费,降低程序效率。
为了避免内存资源的浪费,程序设计人员可以根据要处理的实际数据多少在堆中为数组动态分配内存空间。当程序开始执行时,系统会给出足够的内存空间,这个内存空间在用户的程序之外,称为“堆”,是一块动态内存,用户可以利用适当的内存分配函数来使用这部分内存,并根据实际需要指定数组的大小,数据处理完毕后释放不再使用的内存空间给其他的数据使用。
对数据使用动态存储的一般步骤如下:
确定需要多少内存空间 → 分配需要的存储空间 → 使指针指向获得的内存空间 →用完后释放掉这部分内存空间。
C语言为用户提供了以下几个常用的内存动态分配函数。
1.malloc()函数
函数malloc()的原型如下:
void *malloc( unsigned size);
作用:从堆中申请分配一个大小为size字节的内存块,函数使用完毕后,返回一个指针值,它指向新分配的内存块。如果堆不够分配,则返回的指针值为NULL。
使用malloc()函数,必须将其头文件“stdlib.h”包含进来。在计算内存空间大小时,通常使用sizeof运算符来计算单个数据所需的字节数。
例如:
2.calloc()函数
函数calloc()的原型如下:
void *calloc( unsigned n,unsigned size);
作用:从堆中申请分配n个大小为size字节的连续内存块,函数使用完毕后,返回一个指针值,它指向新分配的首个内存块。如果堆不够分配,则返回的指针值为NULL。
使用calloc()函数,必须将其头文件“stdlib.h”包含进来。
使用calloc()函数申请的内存块应小于64K。若要申请大于64K的内存块,必须使用farcalloc()函数。
例如:
3.free()函数
free()函数的原型如下:
作用:释放指针变量p所指向的内存块。
使用free()函数,必须将其头文件“stdlib.h”包含进来。
例如:
4.realloc()函数
realloc()函数的原型如下:
void *realloc(void *p,unsigned size);
作用:对已经申请成功的内存块进行缩小或扩大重新分配申请,使之大小变为size字节,函数使用完毕后,返回一个指针值,它指向重新分配的内存块,如果重新分配申请不成功,则返回的指针值为NULL。
使用realloc()函数,必须将其头文件“stdlib.h”包含进来。
例如:
例7.8 利用动态内存方法计算一组数的平均值。
程序如下:
程序运行结果如下:
输入将要参加处理的数据个数:5↙
输入将要处理的具体数据(5)个:1.0 4.0 6.0 9.0 3.0↙
平均值为:4.600000
注意:
程序中,只有指针变量p的值不发生改变,才能够保证在动态使用所申请的内存块时不出现数据存取错误。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。