C中的malloc和calloc函数是如何进行内存分配的?

问题描述

malloc() 分配单个内存块,而 calloc() 分配 多个内存块,每个块大小相同。

它们在内部实现上有何不同?

我尝试了下面的代码,并试图找出 malloc 和 calloc 内部实现之间的区别(考虑上面引用的文字)。

#include<stdio.h>
#include<stdlib.h>
int main()
{
   int *p=(int*)malloc(2*sizeof(int));
   p[0]=3;
   p[1]=4;
   printf("%d\t%d",p[0],p[1]);
   free(p);
   int *q=(int*)calloc(2,sizeof(int));
   q[0]=1;
   q[1]=2;
   printf("\n%d\t%d",q[0],q[1]);
   free(q);
   return 0;
}

但是我没有发现这两个函数之间有任何区别(从输出)。 为了理解这两个函数的内部实现,我应该做哪些改变? 这里我对内部实现的意思在上面引用的文字里有提到。

希望你能回答我的问题。

谢谢

解决方法

两者的内部实现观点没有太大区别,或者在大多数实现中,calloc 确实使用 malloc 后跟 memset 来将分配的内存归零,如下面的示例代码片段所示。请参阅 calloc 实现。

void *calloc(size_t n,size_t elem_size)
{
    const size_t nbytes = n * elem_size;
    void *p = malloc(nbytes);
    if (p != NULL) {
       memset(p,nbytes);
    }
    return p;
}