malloc()、calloc()、realloc()
2012-03-07 16:42
169 查看
***** 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所返回的新指针。
函数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所返回的新指针。
相关文章推荐
- malloc calloc realloc 区别
- malloc()和calloc() realloc()
- malloc,calloc,realloc,free
- 【C/C++】内存分配函数:malloc,calloc,realloc,_alloca
- C语言malloc,calloc,realloc,free内存分配函数学习笔记
- 论C语言的malloc,calloc,new,realloc,alloca的机制和区别
- malloc、calloc、realloc的区别
- alloca malloc calloc realloc,new区别联系以及什么时候用
- 动态分配内存函数——calloc,free,malloc,realloc
- C语言之内存分配与释放:malloc, calloc, realloc & free
- malloc、calloc、realloc的区别
- malloc,realloc,calloc的使用场合及特点,以及malloc的实现原理
- c的三个内存分配函数(malloc,realloc,calloc)
- 动态分配内存函数:malloc(),calloc(),realloc()总结
- realloc,malloc,calloc的区别
- llinux -c 之动态内存分配函数(malloc、calloc、realloc)
- C动态内存分配:(三)malloc/calloc/realloc/free使用注意事项
- 浅析C语言之内存分配函数malloc()、realloc()、calloc()
- malloc、calloc、realloc和alloca各种的区别
- 动态内存管理总结(malloc、calloc、realloc的区别),以及内存泄漏常见问题