0

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

6 回答 6

5

至少大约 35 个字节——但 malloc 的典型实现将具有它支持的一些最小分配大小,因此实际上,您可以期望它使用比这更多的内存(尽管具体多少会有所不同)。

在典型情况下,最小分配将是 16 甚至 32 字节,在这种情况下,您上面指定的大多数大小实际上并没有任何区别——最后 5 次分配都将是最小值发生的任何情况是。在典型情况下,大于该值的尺寸也将四舍五入到 2 的下一个幂。

这将为您的第一次分配提供 32 个字节,为其他五个分配 16 或 32 个(即支持的最小大小),总共 112 或 192 个字节。

于 2010-10-01T15:28:51.677 回答
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
于 2010-10-01T15:27:10.407 回答
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);
于 2010-10-01T16:03:55.560 回答
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));
于 2010-10-01T15:28:40.047 回答
1

获取在您的系统上分配了多少字节,例如

#define malloc(s) mm(s)

void *mm(size_t s) {
    printf("allocating %d ...\n", (int)s);
    return (malloc)(s);
}

/* your code */

当然,您可以对尺寸求和而不是打印它们。

于 2010-10-01T16:01:20.560 回答
0

malloc()分配空间最多为 16 个字节(至少在 win32 中),因此您将在第一个分配中使用 32 个字节,在循环中使用 16*5 。

malloc 也有开销(时间和内存),因为在它返回的内存区域之前malloc()放置了一个特殊的标头_CrtMemBlockHeader(这就是为什么你必须给出完全相同的指针free()并且能够使用_msize().

因此,实际使用的内存量为 32 + 80 = 112 字节。还要考虑标头的开销:+ 5 * sizeof(__CrtMemBlockHeader)

最终数量可高达 300 字节,比预期的 35 大约 8 倍。

于 2010-10-01T19:09:29.523 回答