有人声称
在使用
realloc函数释放指针变量后编译器可以自由地将该指针变量用于其他目的,因此您不能保证它具有与之前相同的值
即
void *p = malloc(42);
uintptr_t address = (uintptr_t)p;
free(p);
// [...] stuff unrelated to p or address
assert((uintptr_t)p == address);
可能会失败。
C11附录J.2如下:
指向由free或realloc函数释放的空间的指针的值被使用(7.22.3)[未定义]
但显然该附录不是规范性的。
附录L.3(规范,但可选)告诉我们,如果
指向由free或realloc函数释放的空间的指针的值被使用(7.22.3)。
结果允许是关键未定义行为。
这证实了该声明,但我想从标准文本中看到一个合适的引用,而不是附录。
(uintptr_t)p
会导致未定义的行为 - 在释放p
后,您不允许使用它的值。 (它具有未初始化变量的相同状态) - M.M