2016-09-24 7 views
1

Я динамически выделял 2 разных массива с 1 миллионом ячеек каждый. Один массив содержит целые числа, а один массив содержит указатели на строки фиксированной длины. Когда я запускаю свою программу с помощью gdb, я получаю ошибку: free(): invalid next size (fast). Я должен освобождать память незаконным способом, но я не могу понять, как это сделать. Я опубликовал короткий фрагмент моего кода ниже, где я использую malloc и бесплатно. Можете ли вы сказать мне, что я делаю неправильно? Спасибо.C проблемы с динамической памятью с помощью malloc() и free()

+1

* один массив содержит указатели на строки фиксированной длины * Тогда для этого не используйте 'malloc()'. Также всегда проверяйте возвращаемое значение 'malloc()' 'против' NULL' и не пишите 'x -> y', это ужасно, просто' x-> y' является хорошим, потому что этот тип оператора делает выражение одним в отличие от других операторов, то же самое относится и к '.'. –

+0

Вы уверены, что передали правильный указатель на функцию освобождения или что вы не делали этого дважды? –

+0

@iharob, Извините, я должен был упомянуть, что я не могу использовать 1 млн. Ячеек в будущем, это может варьироваться в зависимости от ввода. – TheEyesHaveIt

ответ

2

За исключением немного странного (см. Комментарий iharob,) код, который вы показываете нам, выглядит правильным.

Ошибка, скорее всего, не в коде, который вы нам показываете.

Что, вероятно, происходит в том, что где-то еще вы заполняете эти «слова» от ваших персонажей, и вы храните более 20 символов, начиная с адреса wc->allWords[i]. Итак, вы пишете конец блока памяти и над заголовком следующего блока памяти.

Затем, адрес блока, который вы пытаетесь освободить, является правильным, но вы повредили заголовок блока, поэтому free() не удалось.

+0

Спасибо, я посмотрю на это. Кроме того, что вы подразумеваете под «повреждением заголовка»? – TheEyesHaveIt

+1

«поврежденный» в этом случае означает «перезаписан». Среда выполнения C имела некоторые значения, хранящиеся там, и вы можете писать над ними символы. –

+0

Вы были правы, проблема была в другом месте. – TheEyesHaveIt