在malloc和calloc之间,哪个分配连续内存?

4

我阅读了很多关于malloc和calloc的链接,但是在“malloc和calloc哪个分配连续内存”方面我仍然有些困惑。

在一些链接中,他们给出了malloc将内存作为字节块连续分配。 但在某些链接中,他们给出了calloc为元素数组分配连续内存。

请给我一个清晰的概念。

2个回答

12

两个调用都会分配连续的内存。

基本上,calloc() 可以被视为在 malloc() 之上的(薄)包装器:

void * calloc(size_t nmemb, size_t size)
{
  const size_t bytes = nmemb * size;
  void *p = malloc(bytes);
  if(p != NULL)
   memset(p, 0, bytes);
  return p;
}

关键在于它并没有特殊的魔法作用,它只是像malloc()一样分配内存,但碰巧a)初始化它,b)有一个接口,使得在您将返回的指针用作数组时很容易使用。

请注意,在具有虚拟内存的现代计算机上,通常不存在底层(物理)内存连续的保证。但由于所有访问都将通过操作系统映射的虚拟地址进行,因此这并不重要。


2
同时要注意,使用虚拟内存并不能保证有足够的空闲物理空间来满足所分配的内存需求(过度提交),而“物理内存”不仅仅指RAM,还包括页式内存。 - msam

3

它们都返回连续的内存:

7.22.3.4

malloc函数分配大小为size指定的对象空间,其值不确定。

7.22.3.2

calloc函数为nmemb个大小为size的对象数组分配空间。该空间初始化为所有位都是零。

6.2.6.1.2

除了位域(bit-fields)外,对象由一个或多个字节的连续序列组成,其数量、顺序和编码要么是明确指定的,要么是实现定义的。

以及6.2.5.20

数组类型描述了具有特定成员对象类型(称为元素类型)的连续分配的非空对象集。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接