我读到用calloc分配的内存“必须一次全部释放”。这是否意味着malloc不是这种情况?如果是的话,谁能给予我一个真实的的例子?非常感谢!
calloc
malloc
2exbekwf1#
使用calloc和malloc分配的内存以相同的方式释放:通过将分配器返回的指针传递给free。混淆可能来自这样一个事实,即calloc是用两个参数来分配数组的,一个参数用于元素大小,另一个参数用于元素的数量。* 一次全部 * 可能指的是这样一个事实,即元素不能单独释放,free必须用指向初始元素的指针来调用,这是calloc返回的指针。对calloc(n1, n2)的调用在语义上等同于:
free
calloc(n1, n2)
#include <limits.h> #include <stdlib.h> #include <string.h> void *calloc(size_t n1, size_t n2) { if (n1 != 0 && n2 > SIZE_MAX / n1) return NULL; size_t size = n1 * n2; void *p - malloc(size); if (p != NULL) memset(p, 0, size); return p; }
dgiusagp2#
calloc()在语义上没有什么不同,除了它将分配的内存初始化为所有位0(而malloc()没有)。calloc()函数应为nelem元素数组分配未使用的空间,每个元素的字节大小为elsize。该空间应初始化为所有位0。传递给free()的指针必须指向与调用内存分配函数返回的内存块相同的内存块,否则行为未定义。free()函数将导致ptr所指向的空间被释放;如果ptr是一个空指针,则不会发生任何动作。否则,如果参数与POSIX. 1 - 2008中的一个函数返回的指针不匹配,该函数像malloc()一样分配内存,或者如果空间已经通过调用free()或realloc()释放,则行为未定义。如果目的是free()未使用的空间(缩小已分配的内存块),请考虑使用realloc()调整其大小。
calloc()
malloc()
free()
realloc()
2条答案
按热度按时间2exbekwf1#
使用
calloc
和malloc
分配的内存以相同的方式释放:通过将分配器返回的指针传递给free
。混淆可能来自这样一个事实,即
calloc
是用两个参数来分配数组的,一个参数用于元素大小,另一个参数用于元素的数量。* 一次全部 * 可能指的是这样一个事实,即元素不能单独释放,free
必须用指向初始元素的指针来调用,这是calloc
返回的指针。对
calloc(n1, n2)
的调用在语义上等同于:dgiusagp2#
calloc()
在语义上没有什么不同,除了它将分配的内存初始化为所有位0(而malloc()
没有)。calloc()函数应为nelem元素数组分配未使用的空间,每个元素的字节大小为elsize。该空间应初始化为所有位0。
传递给
free()
的指针必须指向与调用内存分配函数返回的内存块相同的内存块,否则行为未定义。free()函数将导致ptr所指向的空间被释放;如果ptr是一个空指针,则不会发生任何动作。否则,如果参数与POSIX. 1 - 2008中的一个函数返回的指针不匹配,该函数像malloc()一样分配内存,或者如果空间已经通过调用free()或realloc()释放,则行为未定义。
如果目的是
free()
未使用的空间(缩小已分配的内存块),请考虑使用realloc()
调整其大小。