realloc неинициированого объекта
- Войдите на сайт для отправки комментариев
Пнд, 20/06/2016 - 14:24
будет ли ошибкой применение realloc к обьекту которому еще не выделяли память вообще?
пример (компилятор не ругается):
DeviceAddress *FreeAddress;
FreeAddress = (DeviceAddress*) realloc(FreeAddress, CountFreeAddress*sizeof(DeviceAddress));
с одной стороны логика должна быть такая:
раз указатель равен nil то следующая область памяти занята, и realloc должен перенести на свободный кусок кучи и выделить там память, а по сколько данных не было то и копировать нечего,
но с другой стороны что-то тут вызывает сомнения...
А почитать стандарт, не?
http://www.cplusplus.com/reference/cstdlib/realloc/
Alternatively, this can be a null pointer, in which case a new block is allocated (as if malloc was called).
(напевно)
Ах зачем, зачем читать станда-аа-ар-ты?
спасибо!
зы
я давно нашел ответ русском https://msdn.microsoft.com/ru-ru/library/xbebcx7d.aspx
Ох и грабля хорошая, делать реаллок на неинициализированном указателе. Я не пробовал, конечно, но даже и не хочется пробовать :)
UPD: Только не надо говорить, что этот указатель глобальный. От этого суть не меняется.
Ох и грабля хорошая, делать реаллок на неинициализированном указателе. Я не пробовал, конечно, но даже и не хочется пробовать :)
UPD: Только не надо говорить, что этот указатель глобальный. От этого суть не меняется.
Ну строго говоря да, грабля. Хотя - тут всё зависит от настроек компилятора. Если включить самый высокий уровень warning - то компилятор по рукам настучит за попытку юзать неинициализированный указатель. Хотя, по практике - чаще всего там 0. Но должно != обязано, тут вы правы.
Надо рыть стандарт С, навскидку не помню, что там по этому поводу пишется. Уж лучше сразу инициализировать, у меня это в привычке с детства :)
Ох и грабля хорошая, делать реаллок на неинициализированном указателе. Я не пробовал, конечно, но даже и не хочется пробовать :)
UPD: Только не надо говорить, что этот указатель глобальный. От этого суть не меняется.
Ну строго говоря да, грабля. Хотя - тут всё зависит от настроек компилятора. Если включить самый высокий уровень warning - то компилятор по рукам настучит за попытку юзать неинициализированный указатель. Хотя, по практике - чаще всего там 0. Но должно != обязано, тут вы правы.
Надо рыть стандарт С, навскидку не помню, что там по этому поводу пишется. Уж лучше сразу инициализировать, у меня это в привычке с детства :)
Аналогично, лично я не доверяю это компиляторам, я стараюсь инициализировать все переменные, потому я сразу и обратил внимание на это. Правда на больших компах глобальных переменных мы не юзаем, потому хочешь - не хочешь , нужно инициализировать.
На счет Warnings, на больших компах, стараюсь включить все. Выключенный варнинг сегодня - это, возможно, проблемное будущее. Возможно я шизик, но прога, собранная с warnings - для меня как грязная рубашка при походе на концерт в консерваторию. Потому, когда собираю чужие исходники, стараюсь не смотреть даже как собирается. Меня от этого коробит. Тем более часто можно их в нужном месте погасить, потом включить обратно. Это нормально, потому что ты знаешь, где и зачем выключил.
спасибо!
зы
я давно нашел ответ русском https://msdn.microsoft.com/ru-ru/library/xbebcx7d.aspx
А если давно нашел, зачем спрашивал? Нас проверял? :))))))))))))