Сколько байтов динамически выделяется в следующем сегменте кода? - PullRequest
0 голосов
/ 01 октября 2010

Предполагая, что адрес памяти занимает 4 байта, а символ занимает 1 байт:

char** t;
t = malloc(5 * sizeof(char*));
int i;
for (i = 0; i < 5; i++)
 t[i] = malloc(sizeof(char) * (i+1));

Ответы [ 6 ]

5 голосов
/ 01 октября 2010

Минимум около 35 байтов - но типичная реализация malloc будет иметь некоторый минимальный размер выделения, который он поддерживает, поэтому в действительности вы можете ожидать, что он будет использовать больше памяти, чем это (хотя в точности то, насколько больше будет варьироваться).

В типичном случае минимальное выделение будет примерно 16 или даже 32 байта, и в этом случае большинство указанных вами размеров на самом деле не будут иметь никакого значения - все последние 5 выделений будут любого размера. минимум бывает. В типичном случае размеры, превышающие этот, также будут округлены до следующей степени 2.

Это дало бы 32 байта для вашего первого распределения и 16 или 32 (т. Е. Минимальный поддерживаемый размер) для остальных пяти элементов, что в сумме составляет 112 или 192 байта.

3 голосов
/ 01 октября 2010

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 голосов
/ 01 октября 2010

Пусть компьютер вычислит для вас:

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);
1 голос
/ 01 октября 2010

Получите, сколько байтов выделено НА ВАШЕЙ СИСТЕМЕ с, например,

#define malloc(s) mm(s)

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

/* your code */

Конечно, вы можете суммировать размеры вместо их печати. ​​

1 голос
/ 01 октября 2010

35 на 32-битной машине.

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));
0 голосов
/ 01 октября 2010

malloc() выделяет пространство, округленное до 16 байтов (по крайней мере, в win32), поэтому вы будете использовать 32 байта в первом выделении и 16 * 5 в цикле.

Существуют также служебные данные malloc (и время, и память), потому что malloc() ставит специальный заголовок, _CrtMemBlockHeader перед областью памяти, которую он возвращает (поэтому вы должны дать точно такой же указатель наfree() и могут использовать такие функции, как _msize().

Таким образом, фактически используемый объем памяти будет 32 + 80 = 112 байт. Учитывая также издержки для заголовка: + 5 * sizeof (__ CrtMemBlockHeader)

конечная сумма может достигать 300 байт, что примерно в 8 раз больше ожидаемых 35.

...