内存分配—malloc()和free()

来源:互联网 发布:淘宝德国进口净水器 编辑:程序博客网 时间:2024/06/05 19:57

内存分配—malloc()和free()


一些关于关于内存分配—malloc()和free()的基本知识。

有关指针

指针是用来存放内存地址的,分类型的原因是,指针变量存储的是一个内存空间的首地址(第一个字节的地址)。但这个空间占用的字节和存放的数的类型,是由指针的类型来表明的。系统根据指针类型取相应连续的内存作为一个数据。

存储类型和动态内存分配
程序将可用的内存分成3块,一部分供具有外部链接、内部链接和无链接的静态变量使用,一部分供自动变量使用,一部分供动态内存分配。

静态存储类别所用的内存是在编译的时候确定的,该类别的变量在程序开始执行的时候创建,在程序结束是被销毁。

自动存储类型的变量是在程序进入变量定义的块时存在,在程序离开块时消失,随着程序调用函数和函数结束,自动变量所用的内存数量相应变化。这部分内存通常用作栈来处理,新创建的变量按顺序加入内存,然后以相反的顺序销毁。

动态分配的内存在调用malloc()或相关函数使存在,在free()后释放。这部分内存由程序员管理,可在函数间跨越创建销毁。使用动态内存比使用栈内存慢。


malloc函数

malloc函数的作用就是从内存中申请分配指定字节大小的内存空间。

例:p=(int*)malloc(sizeof(int));
malloc函数的返回类型是void*类型的,标识未确定类型的指针。在C/C++中,void*类型可以强制转换为任何其他类型的指针。上例中将其强制转换为整形指针,以告诉计算机这里的4个字节是一个整体用来存放整数。

malloc函数可以声明变长数组,用变量表达式表示数组的维度,用数组名访问数组元素,或者声明一个指针,调用malloc函数,将其返回赋值给指针,使用指针访问元素,指针可以是静态或者动态的。用这两种方式可以创建动态数组。在程序运行的时候选择数组的大小和分配内存。malloc函数分配内存失败时,返回空指针,这时可以调用exit()退出。

free函数
malloc函数和free函数要配套使用。free函数的参数是之前malloc()返回的地址,是一个指向malloc分配的一块内存,释放之前malloc分配的地址。整个过程也就是malloc和free管理着一个内存池,每次调用malloc分配内存给程序使用,调用free把内存归还给内存池。其他方式分配的内存不能用free释放。

使用free函数是有必要的,若在调用函数的时候,使用malloc函数分配了内存给指针,而没有用free时,当函数结束时,自动变量的指针消失,但之前指针指向的内存还存在,但此时指针已销毁,无法再访问这块内存。就是内存泄漏。

malloc和free的原型都在stdlib.h头文件中,也有calloc函数分配内存。