Страницы

Поиск по вопросам

пятница, 19 апреля 2019 г.

Очистка памяти динамического массива строк

Доброго времени суток. Есть такая задача. Вводится строка, программа должна разбить ее на лексемы, сохранить их в массив data, выполнить какие-то операции и потом успешно завершится. С алгоритмом проблем нет, но вот очистка памяти не работает. Если что, точно известно: количество слов точно не может быть более 25, длина слова - не более 20 символов.
int main() { char* string = (char*)malloc(sizeof(char) * 500); fgets(string, 500, stdin);
char** data = (char**)malloc(sizeof(char*) * 25); for (int i = 0; i < 25; i++) { data[i] = (char*)malloc(sizeof(char) * 20); }
int length = 0; data[length] = strtok(string, " "); length++;
while (data[length - 1] != NULL) { data[length] = strtok(NULL, " "); length++; }
//Do Something
for (int i = 0; i < length; i++) { free(data[i]); } free(data); free(string); return 0; }


Ответ

Как только вы делаете вот этот финт:
data[length] =
т.е. присваиваете указателю новое значение, старое, указывающее на выделенную память, теряется. Получается утечка памяти.
А затем вы пытаетесь удалять то, что не выделяли.
Или просто используйте массив указателей, или, если выделяете память для хранения слов - копируйте слова в выделенную память.
Update Вариант 1:
int main() { ... char** data = (char**)malloc(sizeof(char*) * 25); for (int i = 0; i < 25; i++) data[i] = NULL;
int length = 0; for(char * с = strtok(string, " ");c;c = strtok(NULL, " ")) { data[length++] = c; } //Do Something
free(data); free(string); }
Вариант 2:
int main() { ... char** data = (char**)malloc(sizeof(char*) * 25); for (int i = 0; i < 25; i++) data[i] = (char*)malloc(sizeof(char) * 20);
int length = 0; for(char * с = strtok(string, " ");c;c = strtok(NULL, " ")) { strcpy(data[length++],c); } //Do Something
for (int i = 0; i < 25; i++) { free(data[i]); } free(data); free(string); }
Я бы все же добавил проверки на количество слов и длину... Мало ли кто что обещает...

Комментариев нет:

Отправить комментарий