我基本上有这段代码。
char (* text)[1][80];
text = calloc(2821522,80);
根据我的计算方式,calloc 应该分配了 215.265045 兆字节的 RAM,但是,程序最终超过了这个数字并分配了近 700mb 的内存。
所以看来我无法正确知道该函数将分配多少内存。
如何计算该属性?
calloc
(malloc
就此而言)可以自由分配满足请求所需的空间。
所以,不,你不能提前知道它实际上会给你多少,你只能假设它给了你你要求的数量。
话虽如此,700M 似乎有点过分,所以我会调查是否calloc
仅由一个程序负责,例如,一个只做的程序,仅此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
字节仅比请求的高一点(115,352
字节或) 。0.05%
225,721,760
好吧,这取决于 malloc/calloc 的底层实现。
它通常是这样工作的——有一个叫做堆指针的东西,它指向堆的顶部——动态内存被分配的区域。首次分配内存时,malloc 在内部向内核请求 x 数量的内存 - 即堆指针增加一定量以使该空间可用。x 可能等于也可能不等于您请求的内存块的大小(考虑到未来的 malloc,它可能会更大)。如果不是,那么您至少会获得所需的内存量(有时由于对齐问题,您会获得更多内存)。其余部分成为 malloc 维护的内部空闲列表的一部分。总而言之,malloc 有一些底层数据结构,很大程度上取决于它们是如何实现的。
我的猜测是 x 内存量(无论出于何种原因)比您请求的要大,因此 malloc/calloc 保留了其空闲列表中的其余部分。尝试分配更多内存并查看占用空间是否增加。