我能确定重新分配更少的内存总能找到足够的内存吗?

Can I be sure that reallocating less memory will always find enough of it?

假设我刚刚 malloced x 字节的内存,在对它们进行一些操作后我想要 realloc y < x 字节。我可以做到这一点并确保我的 realloc 能找到足够的内存吗?例如,

int *p = malloc(10);
if (p != NULL) {
    // Do something with `p`.
    int *p_ = realloc(p, 5);
    // Keep doing something else.
}

我是否应该确保 p_ 不是 NULL,即使我重新分配的内存比原始内存少?我认为 *alloc 函数 return NULL 当请求的内存超过可用内存时,以前的代码可以安全使用吗?

Can I be sure that reallocating less memory will always find enough of it?
Can I make that and yet be sure that my realloc will find enough memory?

不,realloc(p, 5); 可能会失败并且 return NULL


Should I make sure p_ isn't NULL even though I have reallocated less memory than the original one?

是的,代码,当缩减并且return是NULL时,可以继续使用旧值指针 - 它仍然有效。

int *p_ = realloc(p, 5); 
if (p_) {
  p = p_;
} else /* if new_size <= old_size and new_size > 0 */ {
  ; // Simply continue with the old `p`, it is still good.
}
// Do something with `p`.
…
free(p);

注意:这个 else 路径通常很难测试。


I think *alloc functions return NULL when the requested memory exceeds the available one, is the previous code safe to use?

不要假设。 realloc() 可能 return NULL 如果新尺寸比以前更大、相同或更小。


设计考虑:

当大小减小时在 realloc() 上返回 NULL 是合理的,当 1) 满足内存 句柄 的数量(系统可能只允许如此多的分配)和 calloc() 可能暂时需要另一个。 2) 新的大小为0。*alloc(0)上的return值的细节有历史,有点争议,这里不做进一步讨论。

在任何情况下,只要新大小大于零,NULL 的 return 就意味着末尾有一些资源。 Occam's razor 建议代码进行与 calloc() returns NULL 由于大小增长时相同的错误处理。