You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中将realloc()返回值赋值给原指针与新指针有何区别?

C语言realloc返回值赋值方式差异解答

核心结论:第一种写法存在严重的内存泄漏和崩溃风险,第二种是符合规范的安全写法,你测试时没发现差异只是因为realloc在你的测试场景下全部调用成功,没有触发异常分支。


先纠正示例代码的常见错误

  • 你给出的realloc第二个参数写的是20,这代表分配20字节而非20个int的空间,在int占4字节的平台上仅能存储5个int,正确写法应为20 * sizeof(int)
  • 第二种写法里的*ptr3;是语法错误,正确声明应为int *ptr3;

两种写法的本质差异

1. 直接赋值给原指针的风险

realloc申请内存失败时会返回NULL,如果直接把返回值覆盖给原指针,原指针持有的、还未释放的有效内存地址会被直接擦除,你再也找不到那块内存的位置,直接造成内存泄漏。
示例风险场景:

int *ptr = calloc(10, sizeof(int));
// 假设当前剩余内存不足,realloc返回NULL
ptr = (int*)realloc(ptr, 1000000 * sizeof(int)); 
// 此时ptr变为NULL,原calloc申请的10个int内存再也无法释放,产生泄漏
// 后续如果直接操作ptr,还会触发空指针访问,直接导致程序崩溃

2. 先赋值给临时指针的优势

先把realloc返回值赋值给临时指针,你可以先判断分配结果,分配成功再覆盖原指针,分配失败时原指针仍然保留着原有内存的地址,可以正常释放避免泄漏,也可以做对应的错误处理。
标准安全写法流程:

int *ptr = calloc(10, sizeof(int));
int *ptr3 = (int*)realloc(ptr, 20 * sizeof(int));
// 先判断realloc是否成功
if (ptr3 == NULL) {
    // 分配失败,先释放原内存避免泄漏
    free(ptr);
    // 执行错误处理逻辑
    perror("内存分配失败");
    exit(1);
}
// 分配成功,再把新地址赋值给原指针
ptr = ptr3;

内容的提问来源于stack exchange,提问作者Sebastian Cadena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 10:27:02