Как 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);