在malloc和calloc之间分配连续的内存

时间:2014-01-24 12:14:17

标签: c malloc calloc

我读了很多关于malloc和calloc的链接,但我仍然对“在malloc和calloc之间分配连续内存”感到困惑。

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

请给我清楚的了解。

2 个答案:

答案 0 :(得分:10)

两个调用分配连续内存。

基本上,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)有一个界面,使其易于使用时你将把返回的指针用作数组。

请注意,与virtual memory的现代计算机上一样,当然不能保证底层(物理)内存是连续的。但由于所有访问都将通过操作系统映射的虚拟地址进行,因此无关紧要。

答案 1 :(得分:2)

它们都返回连续的记忆:

7.22.3.4

  
    

malloc函数为一个对象分配空间,该对象的大小由size和     其价值是不确定的。

  

7.22.3.2

  
    

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

  

6.2.6.1.2

  
    

除了位字段,对象由一个或多个字节的连续序列组成,     其数量,顺序和编码是明确指定的     实现定义的。

  

和6.2.5.20

  
    

数组类型描述了一个连续分配的非空对象集     特定的成员对象类型,称为元素类型