假设我们有:
char *a = malloc(sizeof(char*));
char *b = realloc(a,sizeof(char*));
我们能否安全地说
b
与a
没有别名关系? 参考页面realloc
说:“原始指针ptr无效,任何访问都是未定义的行为(即使重新分配是就地进行的)。”
因此,我们是否可以将
b
标记为不与a
有别名关系,因为我们不能再合法地访问a
了? 然而,这可能会导致一个可疑的优化,下面的分支会被消除:if (a == b)
something..
基于我的理解,
a == b
的比较本身可能是未定义行为(UB),那么这个优化是否在技术上正确呢?
realloc
可能返回一个不同的地址。当这种情况发生时,旧地址会被realloc
释放并可以安全地忽略它。但是,如果realloc
失败,则会返回NULL
,旧地址仍然有效。 - Pablorealloc
也可以返回相同的地址(并且仍然增加内存区域...) - Basile Starynkevitch