按照:
calloc(20, sizeof(int))
malloc(20 * sizeof(int))
这将为 20 个整数分配内存。
malloc()
&是否calloc()
分配虚拟或物理连续空间?
C 并没有说机器既有物理地址空间又有虚拟地址空间。
您所知道的就是您获得了指针,并且您可以按照语言的运算符定义的连续方式对它们进行索引/取消引用。
如果这样做需要硬件将虚拟地址重新映射到物理地址,或者向回复地址位置内容的人发送电子邮件,则由实现定义。
空间是否在物理上是连续的,取决于您正在开发的平台、MMU 和操作系统......
实际上它将是连续的,永远。
无论是 calloc 还是 malloc 都不会产生影响。
两者都将分配连续的虚拟内存。现在假设您正在运行一个将分页用作虚拟内存管理的系统。前十个字可能分配在一个页框的末尾,最后十个字将分配在另一个页框的开头。物理页面分配取决于内核,而不是{m|c}alloc()
实现。这些只会通过系统调用请求更多内存(请参阅brk()
, mmap()
)。因为物理页框分配不一定是连续的,所以您最终将分配的一部分落入一页,而另一部分落入另一页。
在大多数情况下,您不必担心数据是否会跨越页面边界,除非您正在寻找优化并且想要避免过多的次要页面错误。