大话malloc与free

malloc函数是c函数库中的一个标准函数,但是好像很多只学习了c语言,没有接触过数据结构的同学都不太了解甚至完全不清楚这个函数的作用和使用方法。我在大学学c语言时,老师压根没有提过还有malloc这个东西。之后去培训的时候才知道,原来malloc在c语言中这么重要。。。(可见中国某些大学的教育,,,,,,还阔以)

那么malloc到底如何使用,有什么样的功能?我们今天来稍微说一说(笔者只能了解其中皮毛,适合初学者参考,有关其中内存方面的知识,或许以后会讲到吧)

我们都知道,程序编译和运行时,系统会为其分配四个部分的空间,分别是,代码区,数据区,堆区和栈区,其中堆区的空间只有在主动申请时才会分配出来,因此c语言的标准函数库中定义了一个malloc函数来从堆区申请空间,包含在头文件#include<malloc.h>中,下面我们看一段代码,讲解它的具体应用

#include<stdio.h>
#include<malloc.h>
int main()
{
int *p = NUll;in n;

p = (int *)malloc(sizeof(int)*n);

}

这里我们用一个整型指针p指向我们所申请的堆区空间,不一定非是整型,因为堆区的空间分配时不是按类型分配的,而是按所申请的字节个数,这里malloc后面括号中(sizeof(int)*n)就表示n个整型空间,字节个数是4*n,sizeof(int)是用来计算整型的字节个数,malloc前面(int*)其实是一个强制类型转换,因为malloc函数的返回值类型是一个无类型指针(void*),储存的是我们所申请的堆区空间的首地址,因为是无类型,所以我们要把其强制转换成我们所希望的类型(笔者这里为整型),

p = (int *)malloc(sizeof(int)*n);这段代码所表达的意思是,调用malloc函数申请(sizeof(int)*n)个字节大小的空间,把它的地址强制转换为整型指针赋值给我们主函数中所定义的指针变量p,这样我们就可以使用这段堆区空间来存储相应的数据。

free函数

我们知道,堆区的空间不像栈区那样,只在其作用域内有效,程序执行到下一个函数时,栈区空间会被立即释放,而堆区的空间在整个程序运行的过程中都有效,即堆区的空间不会被编译器自己释放(除非程序结束),主动申请,主动释放,而释放时,我们要用到另外一个标准库中的函数,free()

#include<stdio.h>
#include<malloc.h>
int main()
{
int *p,n;
p = (int *)malloc(sizeof(int)*n);
free(p);

}

free函数调用很简单,只有一个参数,即要释放的堆区空间的地址,但是初学者在使用时,往往会忘记使用free函数,这样的话会造成非常严重的后果,因为我们系统为每个程序分配的空间是固定的,如果只申请不释放,程序运行一段时间后你会发现,你的电脑变得越来越卡,这是因为我们把堆区空间申请殆尽导致可用空间太少(参考安卓手机用一段时间后就会变卡,需要经常清理内存)。更甚者会导致程序无法运行,甚至崩溃。因此,一i定要注意:malloc和free两者必须同时出现,不可只有其中之一。

ps:回过头看之前写的几篇,觉得太过空洞,讲解的知识太少,因此这篇或许会显得冗长,望谅解!!!

猜你喜欢

转载自blog.csdn.net/mr_h9527/article/details/80283122