假设一个内存地址占用 4 个字节,一个 char 占用 1 个字节:
char** t;
t = malloc(5 * sizeof(char*));
int i;
for (i = 0; i < 5; i++)
t[i] = malloc(sizeof(char) * (i+1));
假设一个内存地址占用 4 个字节,一个 char 占用 1 个字节:
char** t;
t = malloc(5 * sizeof(char*));
int i;
for (i = 0; i < 5; i++)
t[i] = malloc(sizeof(char) * (i+1));
至少大约 35 个字节——但 malloc 的典型实现将具有它支持的一些最小分配大小,因此实际上,您可以期望它使用比这更多的内存(尽管具体多少会有所不同)。
在典型情况下,最小分配将是 16 甚至 32 字节,在这种情况下,您上面指定的大多数大小实际上并没有任何区别——最后 5 次分配都将是最小值发生的任何情况是。在典型情况下,大于该值的尺寸也将四舍五入到 2 的下一个幂。
这将为您的第一次分配提供 32 个字节,为其他五个分配 16 或 32 个(即支持的最小大小),总共 112 或 192 个字节。
35 字节(请看下面的分解)
char** t;
t = malloc(5 * sizeof(char*)); // 5 * 4 = 20 bytes
int i;
for (i = 0; i < 5; i++)
t[i] = malloc(sizeof(char) * (i+1)); //1 + 2 + 3 + 4 + 5 = 15 bytes
让计算机为您计算:
char** t;
t = (char**) malloc(5 * sizeof(char*));
int i;
for (i = 0; i < 5; i++)
t[i] = (char*) malloc(sizeof(char) * (i+1));
unsigned int sz = 5 * sizeof(char*);
for (i = 0; i < 5; i++)
sz += sizeof(char) * (i+1);
printf("%d\n", sz);
在 32 位机器上为 35。
20为此
t = malloc(5 * sizeof(char*));
15:5+4+3+2+1
int i;
for (i = 0; i < 5; i++)
t[i] = malloc(sizeof(char) * (i+1));
获取在您的系统上分配了多少字节,例如
#define malloc(s) mm(s)
void *mm(size_t s) {
printf("allocating %d ...\n", (int)s);
return (malloc)(s);
}
/* your code */
当然,您可以对尺寸求和而不是打印它们。
malloc()
分配空间最多为 16 个字节(至少在 win32 中),因此您将在第一个分配中使用 32 个字节,在循环中使用 16*5 。
malloc 也有开销(时间和内存),因为在它返回的内存区域之前malloc()
放置了一个特殊的标头_CrtMemBlockHeader
(这就是为什么你必须给出完全相同的指针free()
并且能够使用_msize()
.
因此,实际使用的内存量为 32 + 80 = 112 字节。还要考虑标头的开销:+ 5 * sizeof(__CrtMemBlockHeader)
最终数量可高达 300 字节,比预期的 35 大约 8 倍。