假设一个内存地址占用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));
答案 0 :(得分:5)
至少大约35个字节 - 但是malloc的典型实现将具有它支持的一些最小分配大小,因此实际上,你可以期望它使用更多的内存(尽管确切地说会有多少变化)。
在典型的情况下,最小分配将是16或甚至32字节,在这种情况下,您在上面指定的大多数大小并没有真正有任何区别 - 最后5个分配都将是任何最小的恰好是。在典型情况下,大于该值的大小也会被舍入到下一个2的幂。
这将为您的第一次分配提供32个字节,并为其他五个分配16或32(即,支持的最小大小),总共112或192个字节。
答案 1 :(得分:3)
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
答案 2 :(得分:2)
让计算机为您计算:
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);
答案 3 :(得分:1)
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));
答案 4 :(得分:1)
获取分配了多少字节在您的系统上,例如
#define malloc(s) mm(s)
void *mm(size_t s) {
printf("allocating %d ...\n", (int)s);
return (malloc)(s);
}
/* your code */
当然,您可以将尺寸相加而不是打印它们。
答案 5 :(得分:0)
malloc()
分配最多16个字节的空间(至少在win32中),因此你将在第一个alloc中使用32个字节,在循环中使用16 * 5。
还有malloc(时间和内存)的开销,因为malloc()
在它返回的内存区域之前放置一个特殊的标头_CrtMemBlockHeader
(这就是为什么你必须提供完全相同的指针到free()
并且能够使用_msize()
等函数。
因此,实际使用的内存量为32 + 80 = 112字节。 还要考虑标头的开销:+ 5 * sizeof(__ CrtMemBlockHeader)
最终数量可以高达300字节,比预期的35字节大8倍。