我基本上都有这段代码。
char (* text)[1][80];
text = calloc(2821522,80);
我计算它的方式,那个calloc应该已经分配了215.265045兆字节的RAM,但是,程序最终超过了这个数字并分配了近700mb的内存。
所以看来我无法正确知道该功能将分配多少内存。
如何计算这个属性?
答案 0 :(得分:5)
calloc
(和malloc
就此而言)可以自由分配满足请求所需的空间。
所以,不,你不能事先告诉实际给你多少钱,你只能假设它给你你所要求的金额。
话虽如此,700M看起来有点过分,所以我会调查calloc
是否完全由此负责,例如,仅执行{{1}的程序1}}仅此而已。
您可能还想调查一下测量内存使用情况的方式。
例如,以下程序:
calloc
输出,在我的系统上:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int main (void) {
char (* text)[1][80];
struct mallinfo mi;
mi = mallinfo(); printf ("%d\n", mi.uordblks);
text = calloc(2821522,80);
mi = mallinfo(); printf ("%d\n", mi.uordblks);
return 0;
}
意味着66144
225903256
已分配calloc
字节,这只是请求225,837,112
之上的一个smidgeon(115,352
字节或0.05%
)。
答案 1 :(得分:0)
这取决于malloc / calloc的底层实现。
它通常像这样工作 - 这个叫做堆指针的东西指向堆的顶部 - 动态内存分配的区域。当首次分配内存时,malloc在内部从内核请求x量的内存 - 即堆指针增加一定量以使该空间可用。 x可能会或可能不会等于您请求的内存块的大小(考虑到将来的malloc可能会更大)。如果不是,那么您至少会获得所请求的内存量(有时因为对齐问题而给予更多内存)。其余部分是由malloc维护的内部免费列表的一部分。总结一下,malloc有一些基础数据结构,很大程度上取决于它们的实现方式。
我的猜测是x的内存量(无论出于何种原因)比你要求的要大,因此malloc / calloc在其空闲列表中保留了其余部分。尝试分配更多内存,看看脚印是否增加。