0 / 0 / 0
Регистрация: 29.11.2015
Сообщений: 19
|
|||||||||||
1 | |||||||||||
Перевыделение памяти realloc07.03.2016, 15:56. Показов 3115. Ответов 5
Метки нет Все метки)
(
Есть двумерный массив char **inpWords, в который я добавляю слова из файла, отсеивая пробельные символы. из файла считываю посимвольно. Перед добавлением в массив проверяю, если памяти не хватает, то расширяю ее с помощью realloc. Как я понимаю, в 25 строке не происходит увеличение памяти. Как следствие, в 19 строке при countWord=2 вылетает ошибка, т.к. происходит обращение к неразмеченной области памяти (Ошибка: EXC_BAD_ACCESS (code=1, adress=0x33). Что я делаю не так?
Только что доперло: проблема, видимо в том, что я создал указатели на массивы char*, а под сами массивы память не выделил. Тогда попутно вопрос такой: если есть массив char* mas, необходимо выполнить для него операцию free(mas). Можно передать указатель на массив в функцию и там освободить память?
0
|
|
07.03.2016, 15:56 | |
Ответы с готовыми решениями:
5
Перераспределение памяти, realloc Ошибка при перераспределении памяти realloc
Работа с кучей. Перевыделение памяти |
88 / 88 / 80
Регистрация: 25.08.2013
Сообщений: 337
|
|||||||||||
07.03.2016, 16:53 | 2 | ||||||||||
![]() Решение
Вы не выделяли память под сами слова, после двух введенных слов. Добавлено через 23 минуты
0
|
Вездепух
![]() ![]() 10913 / 5909 / 1614
Регистрация: 18.10.2014
Сообщений: 14,851
|
|
07.03.2016, 18:08 | 3 |
Программа содержит еще одну классическую ошибку: результат 'getc ()' кладется в переменую типа 'char'. А надо бы 'int'.
1
|
88 / 88 / 80
Регистрация: 25.08.2013
Сообщений: 337
|
|
07.03.2016, 19:23 | 4 |
А как тогда? Тогда, чтобы исключить приведение типов, **inpWords тоже необходимо так же определять типа int.
И потом придется в цикле посимвольно печатать. А чем чревато передавать результат getc() в переменную типа char?
0
|
Вездепух
![]() ![]() 10913 / 5909 / 1614
Регистрация: 18.10.2014
Сообщений: 14,851
|
|
07.03.2016, 19:53 | 5 |
Значение EOF, которое может возвращать функция getc(), в общем случае не принадлежит диапазону типа 'char'. Это "допонительное" значение. Поэтому результат getc() надо принимать в переменную типа 'int', проверять на равенство с EOF, и только после этого рассматривать, как 'char'. (После этого гарантируется, что возвращенное значение поместится в 'char'). Если ваша программа работает, то вам "повезло", но формально ваша программа некорректна именно по этой причине.
Исключать "приведение типа" и переобъявлять ваши массивы как 'int', разумеется, не надо? Зачем? Ничего вообще больше в коде менять не надо. Значение типа 'int' само преобразуется к типу 'char' при сохранении в массив. Вам об этом беспокоиться не нужно.
1
|
88 / 88 / 80
Регистрация: 25.08.2013
Сообщений: 337
|
|
07.03.2016, 19:56 | 6 |
Ага, понял) Спасибо) Вспомнил, читал об этом, да))))
0
|
07.03.2016, 19:56 | |
Помогаю со студенческими работами здесь
6
Перевыделение памяти в функции - динамический массив Динамические массивы структур и выделение (перевыделение) памяти
Выделение памяти malloc realloc Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |