1介绍
在C语言的开发学习中,经常要进行内存分配,动态内存分配技术可以保证在程序运行过程中按照实际需要申请适量的内存,使用结束后释放。C语言跟内存申请相关的函数主 要有alloca、 calloc、 malloc、 free、 realloc、 sbrk 等。在实际学 习中主要通过调用库函数malloc 0和free 0来进行内存的分配和释放。
2函数的基本用法
2.1分配内存函数malloc
调用形式: (类型说明符*) malloe (size) ;
功能:在内存的动态存储区中分配-块长度为“size" 字节的连续区域。函数的返回值为该区域的首地址。
“类型说明符”表示把该区域用于何种数据类型。
(类型说明符*)表示把返回值强制转换为该类型指针。“size"是一个无符号数。
例如:
pc= (char *) malloc (100) ;
表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。
2.2释放内存空间函数 free
调用形式: free (void *ptr) ;
功能:释放ptr所指向的一块内存空间,ptr 是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是 由malloc 或calloe函数所分配的区域。
3 malloc 0和free 0的存储机制
3.1堆
堆是共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是用完了要还给操作系统,否则就会内存泄漏。
3.2栈
栈是线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立。每个丽数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动地切换栈,就是切换SS/ESP寄存器。
3.3 malloe 0分配内存
malloc 0从堆里面获得空间,也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。
3.4 free 0释放内存
free ()释放的是指针指向的内存。指针是-一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还存在,只不过现在指针指向的内容是无用的,未定义的。因此,释放内存后把指针指向NULL,防止指针在后面不小心又被引用。
4总结
malloc与free是C语言的标准库函数,当使用malloe() 申请了内存空间后,必须检查是否分配成功,而且malloc (和free(必须是配对使用。当不需要再使用申请的内存时, 必须使用free 0释放,释放后应该把指向这块内存的指针指向NULL,以免分配的空间占着不用,造成内存泄露。