| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > realock неизвестность |
| Автор: Ivankult 24.5.2011, 21:36 | ||||
| Добрый день. Возникла непонятная проблема с выходом за границы массива или чем-то еще. Есть динамический массив, вызываю функцию, передаю его как параметр. В этой функции добавляю пару элементов, возвращаюсь в main-лабуда какая-то. Скрин : http://img847.imageshack.us/img847/6171/61433370.png Вот код main
read
в чем проблема может быть? никогда с таким не сталкивался Заранее благодарю |
| Автор: borisbn 24.5.2011, 21:50 |
| В ф-ции read arr - это "местая" переменная, и запись в неё рез-та realoc'а никак не повлияет на arr, объявленную в main |
| Автор: bsa 24.5.2011, 23:12 |
| Ivankult, замени параметр read(): read(bus *&arr, int *count) Но лучше используй std::vector<bus> |
| Автор: Ivankult 24.5.2011, 23:16 |
| я передаю arr как параметр, а точнее передаю указатель на аrr. Read меняет массив, находящийся по тому же адресу в памяти, что и arr из main, это один и тот же массив! на скрине видно, что при 1 записи все работает норм, а вот при большем количестве записей начинаются косяки. Может проблема в размере структуры(он неверно вычисляет количество памяти для одного элемента)? |
| Автор: bsa 24.5.2011, 23:24 |
| Косяк в том, что кто-то не читал документацию на функцию realloc. А в ней четко написано, что realloc МОЖЕТ вернуть указатель ОТЛИЧНЫЙ от переданного. Чтобы понять почему, представь, что память представляет собой лист в клеточку. Одна клеточка, например, 4096 байт. malloc может тебе выделить только целое количество клеточек. Таким образом, выделив 100 байт, ты займешь область в 4096 байт. Затем ты делаешь realloc и увеличиваешь область до 4000 байт. Так как за выделенную область не вышли, то realloc возвратит исходный указатель. Затем перевыделяем память опять, требуя уже 4100 байт. И тут realloc видит, что клетка, следующая за текущей, уже занята. Поэтому он выделяет новую область памяти в 2 клетки, копирует туда содержимое старой области, освобождает память и возвращает адрес новой области... |