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
相关产品推荐
相关产品推荐

