C内存申请函数

来源:互联网 发布:淘宝卖家激活淘小铺 编辑:程序博客网 时间:2024/04/30 05:25

    C语言跟内存申请相关的函数主要有 alloca、calloc、malloc、free、realloc。


    alloca是向栈申请内存,无需释放。 

    malloc分配的内存是位于堆中的,并且没有初始化内存的内容,因此基本上malloc之后都会调用函数memset来初始化这部分的内存空间(大于128K时,使用mmap函数分配在文件映射区)。malloc()函数有一个参数,即要分配的内存空间的大小, Void *malloc(size_t size);     

    calloc申请并初始化这部分的内存为0。calloc()函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小,void *calloc(size_t numElements,size_t sizeOfElement)。 calloc() 函数会将所分配的内存空间中的每一位都初始化为零,也就是说,如果你是为字符类型或整数类型的元素分配内存,那么这些元素将保证会被初始化为零;如果你是为指针类型的元素分配内存,那么这些元素通常(但无法保证)会被初始化为空指针;如果你是为实数类型的元素分配内存,那么这些元素可能(只在某些计算机中)会被初始化为浮点型的零。    

    realloc是对malloc申请的内存进行大小的调整,申请的内存最终需要通过函数free来释放。

    malloc() 函数和calloc ()函数的另一点区别是calloc()函数会返回一个由某种对象组成的数组,但malloc()函数只返回一个对象。为了明确是为一个数组分配内存空间,有些程序员会选用calloc()函数。但是,除了是否初始化所分配的内存空间这一点之外,绝大多数程序员认为以下两种函数调用方式没有区别:calloc(numElements ,sizeOfElement);    malloc(numElements *sizeOfElement) ;    需要解释的一点是,理论上(按照ANSIC标准)指针的算术运算只能在一个指定的数组中进行,但是在实践中,即使C编译程序或翻译器遵循这种规定,许多C程序还是冲破了这种限制。因此,尽管malloc()函数并不能返回一个数组,它所分配的内存空间仍然能供一个数组使用(对realloc()函数来说同样如此,尽管它也不能返回一个数组)。   


   总之,当你在calloc()函数和malloc()函数之间作选择时,你只需考虑是否要初始化所分配的内存空间,而不用考虑函数是否能返回一个数组。