C - Свободное определенное количество памяти (char **)

Я должен безопасно освободить массив: char ** a; Это похоже на строковый список. Я знаю, сколько char * у меня есть. Но у меня есть проблема, чтобы освободить ВСЕ память. Есть ли функция, которую я могу использовать, чтобы освободить 20 байтов? Я пытался:

for (int i = 0; i < length; i++)
    if (a[i] != null)
        free(a[i]);//some of a[i] ARE null, non-null have different sizes
free(a);//crashes here

but I get runtime errors with asm debugging. Every thing in a has been malloced. For a I malloced 5 strings (each pointer 4 bytes) -> 20 bytes. How can I free the whole char** ?

1
nl ja de
У вас могут быть ошибки памяти в другом месте. Попробуйте использовать детектор утечки памяти (например, valgrind в Linux)
добавлено автор Basile Starynkevitch, источник
Какие ошибки времени выполнения? Все они были malloc ed
добавлено автор Karthik T, источник

3 ответы

Вы не можете освободить 20 байтов, если вы не выделили 20 байтов. Вы можете только освободить блок. Размер этого блока указывается во время распределения. Для каждого выделенного блока требуется отдельное разделение.

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

Если и массив, и показательные элементы в массиве выделены с помощью malloc , то ваш подход правильный. Освободите каждый из элементов, затем освободите массив:

char **arr = malloc (10 * sizeof (char*));
if (arr != NULL)
    for (int i = 0; i < 10; i++)
        arr[i] = malloc (50 + i * 10);//sizes 50, 60, 70, ..., 140

// Use the ten X-character arrays here
//     (other than NULL ones from malloc failures, of course).

if (arr != NULL) {
    for (int i = 0; i < 10; i++)
        free (arr[i]);          //Okay to free (NULL), size doesn't matter
    free (arr);
}
6
добавлено
Это в значительной степени то, как я раскладываю и освобождаю. Моя прога падает на свободный (arr); Имеет ли значение, если я пишу в arr [i] с strncpy раньше?
добавлено автор Bitterblue, источник
Благодаря! Моя бесплатная процедура была сложнее, поэтому я не видел, что я изменял указатель arr, освобождая предметы.
добавлено автор Bitterblue, источник
Только если вы переполнили буфер, который вы выделили для него. Похоже, у вас есть проблема в другом месте, которая развращает арену памяти.
добавлено автор paxdiablo, источник

В коде, который вы опубликовали, нет ничего плохого. Тем не менее, вы можете получить ошибку времени выполнения, если дважды освободите один и тот же фрагмент памяти. Проверьте остальную часть кода и убедитесь, что вы фактически распределяете всю память в этом массиве и не освобождаете его более одного раза.

1
добавлено
После вызова free , часто бывает полезно установить указатель на NULL. Затем, используя отладчик, вы можете увидеть, был ли указатель уже освобожден.
добавлено автор cdarke, источник

При условии, что вы правильно выделили массив char ** и все массивы char *, в которых он содержит указатель, код, который вы опубликовали, должен работать. Как выглядит остальная часть вашего кода?

1
добавлено