“分配给calloc的内存必须一次全部释放”?

xv8emn3q  于 2023-03-22  发布在  其他
关注(0)|答案(2)|浏览(191)

我读到用calloc分配的内存“必须一次全部释放”。
这是否意味着malloc不是这种情况?
如果是的话,谁能给予我一个真实的的例子?非常感谢!

2exbekwf

2exbekwf1#

使用callocmalloc分配的内存以相同的方式释放:通过将分配器返回的指针传递给free
混淆可能来自这样一个事实,即calloc是用两个参数来分配数组的,一个参数用于元素大小,另一个参数用于元素的数量。* 一次全部 * 可能指的是这样一个事实,即元素不能单独释放,free必须用指向初始元素的指针来调用,这是calloc返回的指针。
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;
}
dgiusagp

dgiusagp2#

calloc()在语义上没有什么不同,除了它将分配的内存初始化为所有位0(而malloc()没有)。
calloc()函数应为nelem元素数组分配未使用的空间,每个元素的字节大小为elsize。该空间应初始化为所有位0。
传递给free()的指针必须指向与调用内存分配函数返回的内存块相同的内存块,否则行为未定义。
free()函数将导致ptr所指向的空间被释放;如果ptr是一个空指针,则不会发生任何动作。否则,如果参数与POSIX. 1 - 2008中的一个函数返回的指针不匹配,该函数像malloc()一样分配内存,或者如果空间已经通过调用free()或realloc()释放,则行为未定义。
如果目的是free()未使用的空间(缩小已分配的内存块),请考虑使用realloc()调整其大小。

相关问题