Как malloc char ** таблица? - PullRequest
       26

Как malloc char ** таблица?

6 голосов
/ 18 октября 2011

Я пытаюсь malloc и освободить небольшой массив / таблицу однобуквенных строк. Я знаю, что это можно сделать в массиве, но я хочу попробовать это сделать с помощью malloc и free.

У меня есть это прямо сейчас:

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..это говорит, что free (letters [i]); недействительно.

Любая помощь?

Ответы [ 2 ]

5 голосов
/ 18 октября 2011

Проблема здесь:

letters[0] = "a";
letters[1] = "b";
letters[2] = "c";
letters[3] = "d";
letters[4] = "e";

Вы перезаписываете каждый из ваших указателей malloc строковыми литералами. Затем вы освобождаете их в последнем цикле. Так как вы эффективно освобождаете строковые литералы, это завершается ошибкой.

Есть два способа решить эту проблему:

1: Вам не нужно внутреннее распределение, если вы просто присваиваете им строковые литералы. Так что избавьтесь от обеих петель.

2: strcpy вместо каждого из строковых литералов.

3 голосов
/ 18 октября 2011

Вы правильно распределяете память для каждой строки в массиве, но тогда вы не используете эту память.Вместо этого вы изменяете указатели char* в каждом из пяти элементов массива, чтобы указывать на строковые литералы "a", "b", "c" и т. Д.

Итак, вы потеряли ссылки наисходная память, которую вы распределили, и вместо этого вы пытаетесь освободить память, которая не принадлежит вам.

Вместо назначения строковых указателей, таких как:

letters[0] = "a";

, вы должны копироватьстрока в памяти, которую вы распределили, как это:

strncpy(letters[0], "a", 2);
...