Well, it's the return value in realloc(ptr, 0) case that is implementation-specific, but its behavior _is_ well-defined - it is expected to "deallocate the old object".
My point was that in reality the behavior varies. "Undefined" in a common tongue sense, not in the terms of the C standard.