Как malloc char * * таблица?
Я пытаюсь malloc и освободить небольшой массив / таблицу строк из одной буквы. Я знаю, что это можно сделать в массиве, но я хочу попробовать сделать это с помощью malloc и бесплатно.
У меня есть это прямо сейчас:
char **letters = (char**) malloc(5 * sizeof(char*));
int i =0;
for(i=0; i < NUMLETTERS ; ++i )
{
letters[i] = (char*) malloc(2*sizeof(char)); //2 is for the letter and null terminator
}
letters[0] = "a";
letters[1] = "b";
letters[2] = "c";
letters[3] = "d";
letters[4] = "e";
//Do stuff here
int i =0;
for(i=0; i < 5; ++i )
{
free(letters[i]);
}
free(letters);
приведенный выше код компилируется нормально, и мой код между ними также работает и работает нормально, но во время выполнения он получает ошибку во время свободных частей. Кроме того, после использования valgrind..он говорит, что бесплатно (буквы[i]); является недействительным.
любой помочь?
2 ответов
проблема:
letters[0] = "a";
letters[1] = "b";
letters[2] = "c";
letters[3] = "d";
letters[4] = "e";
вы перезаписываете каждый из ваших указателей malloc'Ed строковыми литералами. Затем вы освобождаете их в последнем цикле. Поскольку вы эффективно освобождаете строковые литералы, он терпит неудачу.
есть два способа решить эту проблему:
1: Вам не нужно внутреннее распределение, если вы просто назначаете им строковые литералы. Так что избавьтесь от обеих петель.
2: strcpy
вместо этого каждый из строковых литералов.
вы правильно выделяете память для каждой строки в массиве, но тогда вы не используете эту память. Вместо этого вы изменяете char*
указатели в каждом из пяти элементов массива указывают на строковые литералы "a", "b", " c " и т. д.
Итак, вы потеряли ссылки на исходную память, которую вы выделили, и вместо этого пытаетесь освободить память, которая вам не принадлежит.
вместо назначения указателей строки, таких как это:
letters[0] = "a";
вы должны копировать строку в выделенную Вами память, например:
strncpy(letters[0], "a", 2);