malloc()、calloc()、realloc()

来源:互联网 发布:大话数据结构是c语言吗 编辑:程序博客网 时间:2024/05/23 12:35

  ***** c语言里的malloc()、calloc()、realloc():      

     函数malloc()和calloc()都可以用来分配动态内存空间,但两者稍有区别。

     (1)malloc()函数有一个参数,即要分配的内存空间的大小:   
          void *malloc(size_t size);   
    calloc()函数有两个参数,分别为元素的数目和每个元素的大小,两个参数的乘积就是要分配的空间的大小:    
     (2) void *calloc(size_t numElements,size_t sizeOfElement);
    如果调用成功,函数malloc()和calloc()都将返回所分配的内存空间的首地址。

    malloc()函数和calloc()函数的主要区别是前者不能初始化所分配的内存空间,而后者能。

    如果由malloc()函数分配的内存空间原来没有被使用过,则其中的每一位可能都是0;

    反之,如果这部分内存空间曾经被分配、释放和重新分配,则其中可能遗留各种各样的数据。

    也就是说,使用malloc()函数的程序开始时(内存空间还没有被重新分配)能正常运行,但经过一段时间后(内存空间已被重新分配)可能会出现问题。

calloc()函数会将所分配的内存空间中的每一位都初始化为零,也就是说,如果你是为字符类型或整数类型的元素分配内存,那么这些元素将保证会被初始化为零;如果你是为指针类型的元素分配内存,那么这些元素通常(但无法保证)会被初始化为空指针;如果你是为实数类型的元素分配内存,那么这些元素可能(只在某些计算机中)会被初始化为浮点型的零。

为了明确是为一个数组分配内存空间,有些程序员会选用calloc()函数。但是,除了是否初始化所分配的内存空间这一点之外,绝大多数程序员认为以下两种函数调用方式没有区别:
    calloc( numElements,sizeOfElement );
    malloc( numElements * sizeOfElement );

需要解释的一点是,理论上(按照ANSIC标准)指针的算术运算只能在一个指定的数组中进行,但是在实践中,即使C编译程序或翻译器遵循这种规定,许多C程序还是冲破了这种限制。因此,尽管malloc()函数并不能返回一个数组,它所分配的内存空间仍然能供一个数组使用(对realloc()函数来说同样如此,尽管它也不能返回一个数组)。总之,当你在calloc()函数和malloc()函数之间作选择时,你只需考虑是否要初始化所分配的内存空间,而不用考虑函数是否能返回一个数组。

realloc函数用于修改一个原先已经分配的内存块的大小。使用这个函数,你可以使一块内存扩大或者缩小。如果它用于扩大一个内存块,那么这块内存原先的内容依然保留,新增加的内存添加到原先内存块的后面,新内存并未以任何方法进行初始化。如果它用于缩小一个内存块,该内存块尾部的部分内存便被拿掉,剩余部分内存的原先内容依然保留。如果原先的内存块无法改变大小,realloc将分配另外一块正确大小的内存,并把原先那块内存的内容复制到新的块上,因此,在使用realloc之后,就不能再使用指向旧内存的指针,而是应该改用realloc所返回的新指针。

 

原创粉丝点击