动态内存分配的大家族

来源:互联网 发布:sql on hadoop 编辑:程序博客网 时间:2024/06/06 03:39

        当我们在声明数组时,一般都会用一个常量去定义数组的长度,但是数组真正的长度在录入数据时才知道的,那么就会存在分配的数组长度不够或是长度太长造成浪费等问题,此时,我们就需要用到“动态内存分配”。在动态内存分配这个大家族中,有malloc(执行动态内存的分配),calloc,realloc,free(释放内存)这些函数,那么应该怎么使用他们,使用时又该注意哪些问题呢?

malloc(stdlib.h)

malloc函数用于执行动态内存分配,当一个程序另外需要一些内存时,程序就调用malloc函数,malloc从内存池中提取一块合适的内存(当然是根据需要算好的内存大小,malloc的参数就是需要分配的内存字节数),并向该程序返回一个指向这块内存的指针。由于malloc函数并不知道你的所要的内存将来是存整形,字符型,还是别的类型,所以malloc函数的返回值类型是void*.

注意

(1)malloc所分配的内存是没有初始化的。

(2)malloc所分配的内存是一块连续的内存。

(3)当malloc函数提取内存的时候,如果内存池为空或者说内存池的内存不够,malloc函数就返回一个NULL指针,所以,对从malloc函数返回的指针都应该进行判断看是不是为NULL,这是很重要的一个步骤。


free(stdlib.h)

free用于释放内存,malloc得到内存并使用后,这个内存就不用了,free就来释放这个内存,其实也就是把内存还给内存池。free参数要么是NULL,要么是从malloc返回的值。free虽然只做了这一个工作,但是它还是很重要的,如果你一直再用malloc向内存池要内存,却没有free,将会引起内存泄漏。在那些所有执行的程序共享一个通用内存池的操作系统中,内存泄漏会一点点的榨干内存池,后果不堪设想。所以free还是很重要的,我认为free就是实现了''有借有还,再借不难''这句俗语。


calloc

calloc 也用于分配内存,不过他在返回指向内存的指针之前把他初始化为0.calloc的参数包括所需元素和每个元素的字节数,它根据这些值来算所需内存的大小。

注意: 

calloc 在返回指向内存的指针之前把它初始化为0,这个会给我们带来方便,但是如果你的程序只是想把一些值存到一个数组里面,那么这个初始化操作就属于浪费时间,所以我们在内存分配的时候要判断应该用malloc好还是calloc好。


realloc

realloc 函数用于修改一个原先已经分配好的内存块的大小,用realloc函数可以使一块内存放大或缩小。如果你要放大内存,则保留原来的内存块不动,在其后直接追加内存块;如果要缩小,该内存块尾部的部分被拿掉,剩余部分内存的原先内容依然保留;如果原先的内存块无法改变大小,realloc 将分配一块合适的内存块,并把原来的那块内存块的内容复制到新的内存块上。所以,在使用realloc后,就不能用指向旧内存的指针,而是改用realloc所返回的新指针。


另外,还需注意在动态内存分配时要检查所请求的内存是否成功分配,操作内存的是不能超出分配内存的边界。


0 0
原创粉丝点击