malloc和calloc分配的内存块布局的差异?

Ava*_* Sk 10 c

calloc分配num每个大小的内存块size:

void * calloc ( size_t num, size_t size );

为内存中的数组分配空间为 num个元素的数组分配一个内存块,每个元素的大小都是字节长,并将其所有位初始化为零.

相反,malloc分配一个大小的内存块size:

void * malloc ( size_t size );

分配内存块 分配一个大小为字节的内存块,返回指向块开头的指针.


两者之间是否有任何区别(零初始化除外calloc)?

calloc究竟是什么意思是num内存块,因为实际上返回的内存区域也是连续的.

我认为必须有一些区别,否则为这些方法定义两个不同的接口没有多大意义?

Art*_*Art 2

实际上他们做同样的事情。calloc 的优点是,良好的实现会在执行所需的乘法以确定需要多少内存时执行溢出检测。

如果你这样做:

void *
calloc(size_t nmemb, size_t size)
{
    size_t sz = nmemb * size;
    void *res = malloc(sz);
Run Code Online (Sandbox Code Playgroud)

'sz' 最终可能不会如您所期望的那样。malloc 所分配的空间将远小于调用者预期的大小,但调用者最终会将返回的区域视为足够大。这会导致堆溢出,从而带来通常具有的所有安全隐患。