根据:
calloc(20, sizeof(int))
malloc(20 * sizeof(int))
这将为20个整数分配内存。
malloc()
和calloc()
分配的是虚拟空间还是物理连续空间?
C语言并不确定计算机是否具有物理地址和虚拟地址空间。
你所知道的只是你获得了指针,并且你可以使用语言的运算符以连续的方式进行索引/取消引用。
如果这样做需要硬件重新映射虚拟地址到物理地址,或者发送电子邮件给某个人,对方回复该地址位置的内容,则是由实现定义的。
两者都将分配连续的虚拟内存。现在假设您正在运行一个使用页面作为虚拟内存管理的系统。前十个单词可能被分配在一页框的末尾,而最后十个单词将被分配在另一页框的开头。物理页分配取决于内核,而不是{m|c}alloc()
实现。这些只会通过系统调用(请参见brk()
,mmap()
)请求更多内存。因为物理页框的分配不一定是连续的,所以您最终会发现分配的一部分落在一个页面中,而落入另一个页面中。
在大多数情况下,您只需要不必担心数据是否跨越页面边界,除非您正在寻找优化并希望避免过多的次要页面故障。