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