realloc分配小于原申请的内存时是否一定成功,需要判空吗?
关于缩小内存场景下realloc调用的安全性问题解答
核心结论
即便你调用realloc时申请的内存小于原分配的内存大小,也无法保证realloc一定成功,你给出的示例代码存在安全风险,必须对realloc的返回值做非空判断。
具体说明
- 你对*alloc系列函数返回NULL的条件存在误解:C语言标准从未规定这类函数仅在请求内存超过系统可用空间时才返回NULL,返回NULL的触发逻辑完全由具体的内存分配器实现决定。
- 缩小内存的realloc调用也可能失败:
部分内存分配器不支持就地修改内存块大小,即便是缩小操作也需要重新分配一块新的更小的内存、拷贝有效数据后再释放原内存块。这种场景下如果遇到极端内存碎片、分配器最小可用单元耗尽等特殊情况,新内存分配就会失败,realloc返回NULL,且此时原指针指向的内存块不会被释放。 - 你给出的示例代码的风险点:
如果你没有判断p_是否为NULL就直接使用,一旦realloc失败,不仅会触发空指针访问,还会丢失原p指针的引用,造成内存泄漏。
正确写法示例
int *p = malloc(10); if (p != NULL) { // Do something with `p` int *p_ = realloc(p, 5); if (p_ == NULL) { // 分配失败的处理逻辑,此时原p仍然有效 free(p); // 补充错误处理,比如打印日志、返回错误码等 } else { p = p_; // 后续使用p的逻辑 } }
补充规范建议
- 任何场景下调用*alloc系列函数(malloc、calloc、realloc、aligned_alloc等),无论申请的内存大小多少,都必须做非空判断,这是C语言内存操作的基本安全要求。
- 不要直接将realloc的返回值赋值给原内存指针,避免分配失败时直接丢失原有效指针的引用。
内容的提问来源于stack exchange,提问作者Giuppox
相关产品推荐
相关产品推荐

