Утверждается, что
компилятор может повторно использовать переменную указателя для какой-либо другой цели после освобождения
realloc, поэтому у вас нет гарантии, что она имеет то же значение, что и раньше,
т
void *p = malloc(42);
uintptr_t address = (uintptr_t)p;
free(p);
// [...] stuff unrelated to p or address
assert((uintptr_t)p == address);
может выйти из строя.
Приложение С11 J.2 гласит
Значение указателя, которое ссылается на пространство, освобожденное вызовом свободной или используется функция realloc (7.22.3) [is undefined]
но приложение, конечно, не является нормативным.
Приложение L.3 (которое является нормативным, но необязательным) говорит нам, что если
Значение указателя, которое ссылается на пространство, освобожденное вызовом free или realloc (7.22.3).
результат разрешен для критического поведения undefined.
Это подтверждает утверждение, но я хотел бы видеть соответствующую цитату из стандартного, а не приложения.