0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 15
|
||||||
1 | ||||||
Не выполняется realloc03.06.2012, 13:35. Показов 3880. Ответов 20
Метки нет (Все метки)
Вообщем, не могу понять в чем ошибка, malloc() работает, а realloc() выдает ошибки. Имеется собственный тип item (структура, в которой два поля, типа char и int), вот тот самый realloc():
vector - указатель типа item size - кол-во элементов, для которых требуется место P.S. IDE - code::blocks OC Linux (Ubuntu)
0
|
03.06.2012, 13:35 | |
Ответы с готовыми решениями:
20
Код не выполняется в одном месте, но выполняется в другом Проект выполняется на Windows 8, но не выполняется на виртуальной машине не выполняется запрос в коде, но выполняется в phpliteadmin realloc |
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 15
|
|
03.06.2012, 13:48 [ТС] | 3 |
0
|
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 15
|
|
03.06.2012, 14:00 [ТС] | 5 |
да нет, даже не в этом дело, указывал и просто число вместо size'а, все равно не помогло.
Добавлено через 4 минуты когда выходит ошибка: "invalid next size: 0x094b5178 ***" она указывает на адрес указателя "vector", может это как-то поможет разобраться в ошибке?!
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
03.06.2012, 14:09 | 6 |
А как инициализировался указатель до realloc?
0
|
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 15
|
|
03.06.2012, 14:12 [ТС] | 7 |
он у меня в классе (в котором объявлена структура item), был объявлен так: "item * vector";
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
03.06.2012, 14:17 | 8 |
realloc применяется только к инициализированному указателю... Или присваивайте ему изначально 0, или первый раз выделяйте память с помощью malloc или calloc.
Добавлено через 3 минуты Тут я имел ввиду при создании объекта а не перед каждым realloc.
0
|
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 15
|
|
03.06.2012, 14:17 [ТС] | 9 |
Сперва я выделил для него память, при помощи malloc(), после начал заносить в память значения и когда ее уже не осталось (а данные надо было куда-то вводить) я вызвал realloc().
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
03.06.2012, 14:18 | 10 |
Выложите весь код тогда уже, иначе мы так будем очень долго гадать
0
|
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 15
|
||||||||||||||||
03.06.2012, 14:52 [ТС] | 11 | |||||||||||||||
хорошо, но не судите строго, за "неграмотность")
Добавлено через 5 минут "vector.h"
(104 строка) здесь я баловался на самом деле ее нужно исключить, хотя всё равно работать не будет
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
03.06.2012, 15:07 | 12 |
Не по теме: За чтож Вас судить, это форум для помощи а не для суждения :) У Вас очень быстро растет размер, причем из ничего. При 12 символах в файле, размер увеличивается в конце до 5 314 410. Конечно, когда int переполняется, размер становится отрицательным, и поэтому realloc выдает ошибку. Я не смотрел полностью код, но ошибка в алгоритме перевыделения памяти. И вообще, увеличение размера в 3 раза это как то слишком.
0
|
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 15
|
|
03.06.2012, 15:10 [ТС] | 13 |
там я тоже начудил, на самом деле я в полтора раза увеличиваю (size=size*3/2). Работать я буду с данными не больше 50 символов, поэтому вызов перераспределения будет около 5 раз, ведь так?
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
03.06.2012, 15:12 | 14 |
В fillNext у Вас выход за пределы массива
Объекта с индексом size не существует, полагаю тут нужно исправить на size - 1. Добавлено через 1 минуту Да дело не в этом, просто даже при увеличении в 3 раза, при 12 символах размер в 5 миллионов какое то вообще не реальное число.
1
|
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 15
|
|
03.06.2012, 15:22 [ТС] | 15 |
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
03.06.2012, 15:32 | 16 |
Если Вы про выход за пределы массива, то это лишь часть проблемы. Потому что после ее исправления, память у меня так же съедалась, размер не изменился. При каких то 12 символах жрет 40 МБ памяти. Советую Вам пересмотреть реализацию перераспределения памяти и проверку на указание последнего элемента.
0
|
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 15
|
|
03.06.2012, 15:42 [ТС] | 17 |
разве 40 мб?!
ну вот допустим, я вызвал: vector=(item *) realloc(vector, size*sizeof(item)); до этого size был равен 10, sizeof(item) равен 8, итого: 80 байт. после перераспределения: 15 * 8 = 120 байт, *(+еще предыдущие 80 байт), итого: 200 байт, а не 40 мбайт
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
03.06.2012, 15:45 | 18 |
У меня, при наличии в файле 12 символов, размер в конце равен, как я и писал выше, 5 314 410.
0
|
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 15
|
|
03.06.2012, 15:48 [ТС] | 19 |
а у меня вроде не так. А могли бы вы показать, как вы проверяете размер занятой памяти?
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
03.06.2012, 16:05 | 20 |
Вывод консоли
size_malloc= 80
индексирование выполнено dataList.head= 0 ***переход*** переход в else перед realloc vector= 0x8764e0 size_realloc= 240 size= 30 realloc выполнен индексирование выполнено перераспределение выполнено ***переход*** vector[dataList.curr].element= 1 ***переход*** переход в else перед realloc vector= 0x8764e0 size_realloc= 720 size= 90 realloc выполнен индексирование выполнено перераспределение выполнено ***переход*** vector[dataList.curr].element= 2 ***переход*** переход в else перед realloc vector= 0x8764e0 size_realloc= 2160 size= 270 realloc выполнен индексирование выполнено перераспределение выполнено ***переход*** vector[dataList.curr].element= 3 ***переход*** переход в else перед realloc vector= 0x8764e0 size_realloc= 6480 size= 810 realloc выполнен индексирование выполнено перераспределение выполнено ***переход*** vector[dataList.curr].element= 3 ***переход*** переход в else перед realloc vector= 0x876d60 size_realloc= 19440 size= 2430 realloc выполнен индексирование выполнено перераспределение выполнено ***переход*** vector[dataList.curr].element= 2 ***переход*** переход в else перед realloc vector= 0x8786c0 size_realloc= 58320 size= 7290 realloc выполнен индексирование выполнено перераспределение выполнено ***переход*** vector[dataList.curr].element= 1 ***переход*** переход в else перед realloc vector= 0x2f7fd0 size_realloc= 174960 size= 21870 realloc выполнен индексирование выполнено перераспределение выполнено ***переход*** vector[dataList.curr].element= 1 ***переход*** переход в else перед realloc vector= 0x3063b0 size_realloc= 524880 size= 65610 realloc выполнен индексирование выполнено перераспределение выполнено ***переход*** vector[dataList.curr].element= 2 ***переход*** переход в else перед realloc vector= 0x330f30 size_realloc= 1574640 size= 196830 realloc выполнен индексирование выполнено перераспределение выполнено ***переход*** vector[dataList.curr].element= 3 ***переход*** переход в else перед realloc vector= 0x6e0040 size_realloc= 4723920 size= 590490 realloc выполнен индексирование выполнено перераспределение выполнено ***переход*** vector[dataList.curr].element= 3 ***переход*** переход в else перед realloc vector= 0x880040 size_realloc= 14171760 size= 1771470 realloc выполнен индексирование выполнено перераспределение выполнено ***переход*** vector[dataList.curr].element= 1 ***переход*** переход в else перед realloc vector= 0xd10040 size_realloc= 42515280 size= 5314410 realloc выполнен индексирование выполнено перераспределение выполнено ***переход*** vector[dataList.curr].element= 2 Просто перед return 0; в main вставьте какую нибудь функцию для паузы программы. И после того как данные считаются, посмотрите сколько она занимает памяти в диспетчере задач.
0
|
03.06.2012, 16:05 | |
03.06.2012, 16:05 | |
Помогаю со студенческими работами здесь
20
realloc realloc realloc Realloc Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |