Как отмечено в комментариях, случай 3 в вопросе (без памяти) неверен; realloc()
вернет NULL, если нет доступной памяти [вопрос теперь исправлен].
Стив Макконнелл в «Code Complete» указывает, что, если вы сохраняете возвращаемое значение из realloc()
в единственной копии исходного указателя, когда realloc()
не удается, вы просто вытекли из памяти. То есть:
void *ptr = malloc(1024);
...
if ((ptr = realloc(ptr, 2048)) == 0)
{
/* Oops - cannot free original memory allocation any more! */
}
Различные реализации realloc () будут вести себя по-разному. Единственное, что можно с уверенностью предположить, это то, что данные будут всегда перемещаться - что вы всегда получите новый адрес, когда будете использовать realloc () памяти.
Как заметил кто-то другой, если вас это беспокоит, возможно, пришло время взглянуть на ваши алгоритмы.