LINUX.ORG.RU

realloc меняет указатель (?)


0

0

есть такой код:

unsigned int **edges; ... edges = (unsigned int **) calloc (sizeof(unsigned int *), initial_size); ... edges = (unsigned int **) realloc (edges, size+size2change)*sizeof(unsigned int*));

после чего значение edges меняется, и все записанные значения теряются. это как? в мане написано, что realloc либо сохраняет значение указателя, либо возвращает NULL

anonymous

Разберись со скобками - у тебя чушь написана:
... edges = (unsigned int **) realloc (edges, size+size2change)*sizeof(unsigned int*));
К чему относится последняя скобка? Такое ни один компилер не пропустит.

Die-Hard ★★★★★
()


man realloc:
realloc() returns a pointer to the newly allocated memory,
which is suitably aligned for any kind of variable and may be different from ptr, or NULL if the request fails or if
^^^^^^^^^^^^^^^^^^^^^
size was equal to 0. If realloc() fails the original
block is left untouched - it is not freed or moved.

master
()

Дело тут вот в чем. Память из кучи, как известно, выделяется по-разному (ну, в смысле разные стратегии существуют -- best fit, first fit, etc), но общим является то, что при выделении памяти менеджер памяти возвратит тебе не обязательно память того размера, которую ты попросил. Практически всегда он возвращает памяти больше, чем было указано в запросе пользователя, так как эта память или chunk оставшийся от предыдущего использования или планировщик счел что отрезать от chunka 80% памяти под твой запрос, а еще 20% -- оставить, невыгодно. Поэтому памяти выделилось чуть-чуть больше. Так вот, отвечаю на Ваш вопрос. Вам выделили память под массив указателей, вы ее используете. Затем вы захотели размер массива увеличить. Если размер массива ПОСЛЕ УВЕЛИЧЕНИЯ таков, что влезает в кусок памяти уже выделенный вами планировщиком, то планировщик будет использовать уже выделенную для Вас память и "realloc указатель не изменит". Если же размер выделенной вам памяти МЕНЬШЕ, чем размер массива ПОСЛЕ УВЕЛИЧЕНИЯ, то произойдет следующее: 1. Планировщик выделит Вам из кучи память, достаточную для хранения массива 2. realloc СКОПИРУЕТ данные Вашего массива во вновь выделенную память 3. Память, использовавшаяся под массив до этого, будет возвращена в кучу. В этом случае "realloc указатель изменит", так как, естественно, будет указывать на другую область памяти. Данныме из массива, естественно, не изменятся. // --------------------------- С уважением Юрий Фролов _agnostic@mtu-net.ru

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.