在以下代码段中动态分配了多少字节?

时间:2010-10-01 15:25:44

标签: c byte dynamic-memory-allocation

假设一个内存地址占用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));

6 个答案:

答案 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)

在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));

答案 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倍。