realloc неинициированого объекта

vde69
Offline
Зарегистрирован: 10.01.2016

будет ли ошибкой применение realloc к обьекту которому еще не выделяли память вообще?

пример (компилятор не ругается):

DeviceAddress *FreeAddress;

FreeAddress = (DeviceAddress*) realloc(FreeAddress, CountFreeAddress*sizeof(DeviceAddress));

 

с одной стороны логика должна быть такая:

раз указатель равен nil то следующая область памяти занята, и realloc должен перенести на свободный кусок кучи и выделить там память, а по сколько данных не было то и копировать нечего,

но с другой стороны что-то тут вызывает сомнения...

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

А почитать стандарт, не?

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).

(напевно)

Ах зачем, зачем читать станда-аа-ар-ты?

vde69
Offline
Зарегистрирован: 10.01.2016

спасибо!

зы

я давно нашел ответ русском https://msdn.microsoft.com/ru-ru/library/xbebcx7d.aspx

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Ох и грабля хорошая, делать реаллок на неинициализированном указателе. Я не пробовал, конечно, но даже и не хочется пробовать :)

UPD: Только не надо говорить, что этот указатель глобальный. От этого суть не меняется.

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

kisoft пишет:

Ох и грабля хорошая, делать реаллок на неинициализированном указателе. Я не пробовал, конечно, но даже и не хочется пробовать :)

UPD: Только не надо говорить, что этот указатель глобальный. От этого суть не меняется.

 

Ну строго говоря да, грабля. Хотя - тут всё зависит от настроек компилятора. Если включить самый высокий уровень warning - то компилятор по рукам настучит за попытку юзать неинициализированный указатель. Хотя, по практике - чаще всего там 0. Но должно != обязано, тут вы правы.

Надо рыть стандарт С, навскидку не помню, что там по этому поводу пишется. Уж лучше сразу инициализировать, у меня это в привычке с детства :)

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

DIYMan пишет:

kisoft пишет:

Ох и грабля хорошая, делать реаллок на неинициализированном указателе. Я не пробовал, конечно, но даже и не хочется пробовать :)

UPD: Только не надо говорить, что этот указатель глобальный. От этого суть не меняется.

 

Ну строго говоря да, грабля. Хотя - тут всё зависит от настроек компилятора. Если включить самый высокий уровень warning - то компилятор по рукам настучит за попытку юзать неинициализированный указатель. Хотя, по практике - чаще всего там 0. Но должно != обязано, тут вы правы.

Надо рыть стандарт С, навскидку не помню, что там по этому поводу пишется. Уж лучше сразу инициализировать, у меня это в привычке с детства :)

Аналогично, лично я не доверяю это компиляторам, я стараюсь инициализировать все переменные, потому я сразу и обратил внимание на это. Правда на больших компах глобальных переменных мы не юзаем, потому хочешь - не хочешь , нужно инициализировать.

На счет Warnings, на больших компах, стараюсь включить все. Выключенный варнинг сегодня - это, возможно, проблемное будущее. Возможно я шизик, но прога, собранная с warnings - для меня как грязная рубашка при походе на концерт в консерваторию. Потому, когда собираю чужие исходники, стараюсь не смотреть даже как собирается. Меня от этого коробит. Тем более часто можно их в нужном месте погасить, потом включить обратно. Это нормально, потому что ты знаешь, где и зачем выключил.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vde69 пишет:

спасибо!

зы

я давно нашел ответ русском https://msdn.microsoft.com/ru-ru/library/xbebcx7d.aspx

А если давно нашел, зачем спрашивал? Нас проверял? :))))))))))))