谈谈malloc()和free()

来源:互联网 发布:mysql存储过程实例 编辑:程序博客网 时间:2024/06/03 15:41

1.函数原型

(void *)malloc(int size)

malloc函数的返回值是一个void类型的指针,参数为int类型数据,即申请分配的内存大小,单位是byte。
内存分配成功之后,malloc函数返回这块内存的首地址。你需要一个指针来接收这个地址。但是由于函数的返回值是void *类型的,所以必须强制转换成你所接收的类型。也就是说,这块内存将要用来存储什么类型的数据。

比如:
char * p = (char *)malloc(100);
在堆上分配了100个字节内存,返回这块内存的首地址,把地址强制转换成char 类型后赋给char 类型的指针变量p。同时告诉我们这块内存将用来存储char类型的数据。也就是说你只能通过指针变量p来操作这块内存。这块内存本身并没有名字,对它的访问是匿名访问。

申请内存失败

如果所申请的内存块大于目前堆上剩余内存块(整块),则内存分配会失败,函数返回NULL。注意这里说的“堆上剩余内存块”不是所有剩余内存块之和,因为malloc函数申请的是连续的一块内存。既然malloc函数申请内存有不成功的可能,那我们在使用指向这块内存的指针时,必须用if(NULL!=p)语句来验证内存确实分配成功了。

申请0字节内存

此时函数并不返回NULL,而是返回一个正常的内存地址。但是你却无法使用这块大小为0的内存。这
好比尺子上的某个刻度,刻度本身并没有长度,只有某两个刻度一起才能量出长度。对于这
一点一定要小心,因为这时候if(NULL!=p)语句校验将不起作用。

内存释放

free函数可以释放malloc申请的空间,它只有一个参数,就是所要释放的内存块的首地址。
free(p)实质作用:斩断指针变量与这块内存的关系。free(p)后,p就不能操作这块空间了,但注意了此时p里面还是存着这块空间的地址,所以还有把p指空(p = NLLL)
注意:不能对P连续2次以上使用free函数。malloc和free必须是一一对应,如果是多对一会发生内存泄漏,一对多会发生错误。