![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| EGD |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 25.10.2009 Репутация: нет Всего: нет |
начал делать задачку № 5.13 из незабвенной книги K&R и столкнулся с проблемой аварийного завершения программы при обращении к функции free()
собственно код программы:
в кратце что она делает: читает из stdin построчно и запносит в массив из argv[1] строк или 10 по умолчанию. нужно вывести последние argv[1] строк (примерно тоже самое делает программа tail). для экономии памяти, как и было написано в задании, я для каждой строки использовал минимум памяти. если мы считали больше строк, чем может поместится в массиве - самую первую строку выталкиваем и сдвигаем все строки вверх, на освободившееся место помещаем новую. и так далее пока не встретим EOF. выводим что у нас получилось. но при удалении первой строки получаем аварийное завершение с бектрейсом следующего содержания:
а вот работающий код. отличие лишь в том, что для строк сразу задаем всю память, причем фиксированного размера MAXLINE. но это же очень расточительно! есть идея использовать связанный список, но задача поставлена на использовании массивов.
Это сообщение отредактировал(а) EGD - 26.10.2009, 12:20 |
||||||
|
|||||||
| niXman |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 211 Регистрация: 4.7.2009 Репутация: 0 Всего: 0 |
--------------------
if ( !c++ ) { *power--; this->wussiness += 10;} |
|||
|
||||
| EGD |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 25.10.2009 Репутация: нет Всего: нет |
niXman,
данная неточность не влияет на аварийный останов при обращении к free(). тут была бы ошибка сегментирования или еще какая пакость. после учета всех замечаний получилось следующее. с тем же результатом когда доходим до free()
Это сообщение отредактировал(а) EGD - 26.10.2009, 13:52 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
EGD,
возьми valgrind -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| niXman |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 211 Регистрация: 4.7.2009 Репутация: 0 Всего: 0 |
А в чем все же проблема? Просто нет сейчас возможности валгринд использовать. Я исправил в своем коде, и все заработало. Только что попробовал запустить исходный код, та же ошибка. Вывод?... --------------------
if ( !c++ ) { *power--; this->wussiness += 10;} |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
вывод такой: или будем надеяться на Бога, чтобы программа не рухнула в самый неподходящий момент. или просмотрим исходник ещё раз. или глазами. или valgrind'oм. |
|||
|
||||
| EGD |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 25.10.2009 Репутация: нет Всего: нет |
вот так работает и одновременно экономно. про sizeof я ступил. прошу прощения, больше не буду. правильно конечно же strlen + 1. изминений не много. я их выделил жирным. пытаюсь понять почему не работало до этого. спасибо за помощь.
еще посоветовали сделать вот что
Это сообщение отредактировал(а) EGD - 26.10.2009, 18:31 |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |