Динамически выделить память для строкового массива в C - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь сохранить список каждой точки монтирования в системе Linux в строковом массиве с C. Я сосредоточен на этом фрагменте кода.

int i = 0;
char **mountslist = malloc(1024 * sizeof(char *));

/*
 * Make sure that the number entries in the array are less than the allocated
 * 1024 in the absurd case that the system has that many mount points.
 */
while (i < 1024 && (ent = getmntent(mounts))) {
    /*
     * The output of getmntent(mounts) goes down to
     * the next mount point every time it is called.
     */
    mountslist[i] = strdup(ent->mnt_dir);
    i++;
}

Мне было интересно, как я мог бы динамически распределять количество записей в массиве mountslist (в настоящее время статически установлен на 1024), чтобы избежать этого ограничения и тратить память. Если бы при объявлении mountslist у меня было окончательное значение i, я мог бы использовать char *mountslist[i]; или char **mountslist = malloc(i * sizeof(char *));

1 Ответ

0 голосов
/ 29 августа 2018

Вы можете использовать realloc, чтобы изменить размер выделенного блока памяти:

int i = 0;
int len = 10;
char **mountslist = malloc(len * sizeof(char *));

while ((ent = getmntent(mounts)) != NULL) {
    if (i >= len) {
        len *= 2;
        char **tmp = realloc(mountslist, len * sizeof(char *));
        if (tmp) {
            mountslist = tmp;
        }
    }
    mountslist[i] = strdup(ent->mnt_dir);
    i++;
}

Как показано выше, хорошим правилом является удвоение количества пространства, которое вы выделяете, когда у вас заканчивается пространство. Это предотвращает чрезмерные вызовы realloc, которые могут перемещать выделенную память каждый раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...