我读了很多关于malloc和calloc的链接,但我仍然对“在malloc和calloc之间分配连续内存”感到困惑。
在某些链接中,他们给malloc分配连续内存作为字节块 但是在一些链接中,他们给calloc为一个元素数组分配了连续的内存。
请给我清楚的了解。
答案 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
数组类型描述了一个连续分配的非空对象集 特定的成员对象类型,称为元素类型