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

C++中使用malloc分配二维数组时如何避免覆盖已有值

动态二维数组扩容问题的修正方案

原代码的核心错误分析

  • realloc参数错误:原代码中realloc(*arr, buffer_size *sizeof(int))存在两处问题:一是传入*arr(第一个内层数组的地址)而非外层指针数组的地址arr;二是计算大小用sizeof(int),但外层数组存储的是int*类型,应该用sizeof(int*),这是导致段错误的关键原因。
  • 重复分配覆盖原有数据:扩容时循环从i=0开始重新malloc内层数组,会直接覆盖之前已分配好的arr[0]-arr[2]指针,导致原有数据丢失且产生内存泄漏。
  • 函数未返回数组:array_creation函数定义返回int**,但未执行return arr,调用后无法获取创建的数组。

修正后的完整代码实现

1. 数组初始化函数

int ** array_creation (){
    int ** arr = (int **) malloc(buffer_size * sizeof(int *));
    if (arr == NULL) { // 检查外层数组分配是否成功
        return NULL;
    }
    for(int i=0;i<buffer_size;i++){
        arr[i] = (int *)malloc(26 * sizeof(int));
        if (arr[i] == NULL) { // 内层分配失败时,释放已分配的内存避免泄漏
            for (int j = 0; j < i; j++) {
                free(arr[j]);
            }
            free(arr);
            return NULL;
        }
    }
    return arr; // 返回创建完成的二维数组
}

2. 扩容逻辑

if(buffer_count >= buffer_size){
    int old_size = buffer_size;
    buffer_size *= 2; 
    // 用临时变量接收realloc结果,避免分配失败时丢失原数组地址
    int ** temp_arr = (int **) realloc(arr, buffer_size * sizeof(int *));
    if (temp_arr == NULL) { // realloc失败,恢复原大小并终止扩容
        buffer_size = old_size;
        return;
    }
    arr = temp_arr;
    // 仅为新增的外层元素分配内层数组(从old_size到新size-1)
    for(int i=old_size;i<buffer_size;i++){
        arr[i] = (int *)malloc(26 * sizeof(int));
        if (arr[i] == NULL) { // 内层分配失败时,清理新增部分并恢复状态
            for (int j = old_size; j < i; j++) {
                free(arr[j]);
            }
            buffer_size = old_size;
            return;
        }
    }
}

关键注意事项

  • realloc的安全使用:必须用临时变量接收返回值,若直接赋值给arr,一旦realloc失败返回NULL,原数组的地址会丢失,造成内存泄漏。
  • 仅分配新增空间:原有old_size个元素已经完成内层数组分配,无需重复操作,避免覆盖原有数据。
  • 内存失败处理:每次malloc/realloc都要检查返回值,分配失败时及时释放已分配的内存,避免内存泄漏。
  • buffer_count维护:每次成功向内层数组添加元素后,务必递增buffer_count,确保扩容时机准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:10:40