c语言 分配内存:malloc()和 free()

通过使用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 (中文版)第五版

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值