【问题标题】:How is the memory allocation done by malloc and calloc function in C?C 中 malloc 和 calloc 函数如何分配内存?
【发布时间】:2021-05-10 06:11:54
【问题描述】:

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;
}

但我没有发现这两个函数之间有任何区别(从输出)。 我应该做些什么改变来理解这两个功能的内部实现? 在上面引用的文本中提到了我对内部实现的含义。

希望你能得到我的问题。

谢谢

【问题讨论】:

  • 引用是 API 定义的差异,不一定是内部实现 - malloc 接受字节作为大小,而 calloc 接受元素数量和元素大小(以字节为单位)。事实上,除了处理calloc 的大小和内存归零的一小部分外,任何实现很可能两者在很大程度上是相同的。

标签: c malloc calloc


【解决方案1】:

两者的内部实现角度没有太大区别,或者在大多数实现中calloc 确实使用malloc 后跟memset 将分配的内存归零,如下面的示例 sn-p 所示。参考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, 0, nbytes);
    }
    return p;
}

【讨论】:

  • 内存分配是malloc还是calloc类似于数组(静态内存分配创建)?
  • @AbhishekJaiswal,malloc/calloc 是在运行时动态分配的,而数组静态分配在程序编译时是静态的。
猜你喜欢
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 2022-01-17
  • 2020-12-14
相关资源
最近更新 更多