通过使用malloc(),程序可以在运行时决定需要多大的数组并创建它。
malloc()可以在程序运行时分配更多的内存,它接受一个参数:所需的字节数。然后malloc()找到可用内存中的一个大小适合的块。内存是匿名的,也就是说,malloc()分配 了内存,但没有为它指定名字,但可以返回那块内存的第一个字节的地址,可以把这块地址赋值给一个指针变量,并使用该指针来访问那块内存。
函数malloc()可用来返回数组的指针、结构指针,因此需要把返回值给其他类型指派为适当的类型
如果malloc()找不到所需的空间,它就会返回一个空指针。
例如:
使用malloc()来创建一个数组,可以在运行时使用malloc()请求一个存储块,另还需要一个指针来存放该块在内存中的位置。
double * ptd;
ptd = (double *)malloc (30 * sizeof (double));//sizeof 是以字节为单位给出的数据大小
这段代码请求了30个double类型值的空间,并把pid指向该空间所在位置。注意ptd是作为指向一个double类型值的指针声明,而不是指向30个double类型值的数据块的指针。(double *)为double 指针类型指派,是可选的。
注意:数组的名字是它第一个元素的地址,因此ptd指向一个内存块的第一个元素,就可以像使用数组名一样使用它。
对应每个malloc()调用,应该调用一次free()。函数free()的参数是先前的malloc()返回的地址,它释放先前分配的内存。这样,所分配内存的持续时间从调用malloc()分配内存开始,到调用free()释放内存以供再使用为止。free()参数是一个指针,指向malloc()分配的内存块。
使用malloc()和free(),记得添加函数的预处理指令库
#include <stdlib.h> //为malloc()和free()函数提供原型
使用malloc()分配内存,记得进行判空,malloc()可能无法获取所需数量的内存,则会返回空指针
if(ptd == NULL){
puts("Memory allocation failed .");
//EXIT_FAILURE 程序异常终止 函数的原型在stdlib.h
exit (EXIT_FAILURE);//内存分配失败时结束程序
}
free()讲解
函数free()只释放它的参数所指向的内存块。只有在特定情况下,free()不是必须的,因为在程序终止后会所有已分配的内存都自动释放。但最好在末尾添加free()函数。
在编译程序时,静态变量的数量是固定的。在程序运行时已不改变。自动变量使用的内存数量在程序执行时自动增加或减少。但被分配的内存所使用内存数量只会增加,除非使用free()。
函数调用终止时,虽然指针作为一个自动变量消失了,但它所指向的内存仍旧存在,且不可使用,下次调用该函数时,会重新分配新的内存块,若执行大量的循环操作,程序容易引起内存溢出,即内存泄漏,所以添加free()可防止该问题发生。
内存分配calloc与malloc()类似
long * newmen;
newmen = (long *) calloc(100,sizeof(long));
第一个参数是所需内存单元的数量,第二个参数是每个单元以字节计的大小
在这里。long使用4个字节,因此这一指令建立了100个4个字节单元,总共使用400个字节来存储
sizeof(long)使用这个,而不用4是方便代码移植。
函数calloc有一个特性就是它将块中的全部位 置为0(注意在某些硬件系统,浮点值0不是用全部位为0来表示)
free()函数也可以释放calloc分配的内存
该文章出自于于Primer Plus C (中文版)第五版