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

如何在C++中正确使用realloc重新分配二维数组

二维数组realloc扩容的问题解决

问题根源

你的代码存在两个关键错误导致段错误:

  1. realloc大小计算错误:注释里的realloc(arr, buffer_size * sizeof(int))误用了sizeof(int),但arr是int**类型,每个元素是int*指针,必须用sizeof(int*)计算空间,否则分配的内存不足以容纳新的指针数组,越界访问会触发段错误。
  2. 新扩容指针未初始化:即便修正了大小,realloc后新增的3个指针(原buffer_size为3,扩容后为6,对应索引3-5)是未分配内存的野指针,直接访问会引发段错误,需要为这些指针单独malloc分配26个int的空间。

修正后的代码

// 数组创建函数
int** array_creation() {
    int** arr = (int**)malloc(buffer_size * sizeof(int*));
    if (arr == NULL) {
        cout << "malloc fail" << endl;
        return NULL; // 分配失败返回NULL,避免后续非法访问
    }
    for (int i = 0; i < buffer_size; i++) {
        arr[i] = (int*)malloc(26 * sizeof(int));
        if (arr[i] == NULL) {
            cout << "malloc fail" << endl;
            // 可选:清理已分配的内存避免泄漏
            for (int j = 0; j < i; j++) free(arr[j]);
            free(arr);
            return NULL;
        }
    }
    return arr;
}

// 主逻辑部分
int buffer_size = 3;
int buffer_count = 0;
int** arr = array_creation(); // 初始化数组

// 触发扩容的逻辑
if (buffer_count >= buffer_size) {
    cout << "Doubling the size of dynamic arrays!" << endl;
    int new_size = buffer_size * 2;
    // 用临时变量接收realloc结果,防止分配失败丢失原指针
    int** temp_arr = (int**)realloc(arr, new_size * sizeof(int*));
    if (temp_arr == NULL) {
        cout << "realloc fail" << endl;
        // 处理失败逻辑,比如保留原数组或释放内存
        return;
    }
    arr = temp_arr;
    // 为新增的指针分配内存
    for (int i = buffer_size; i < new_size; i++) {
        arr[i] = (int*)malloc(26 * sizeof(int));
        if (arr[i] == NULL) {
            cout << "malloc fail" << endl;
            // 清理已分配的新内存
            for (int j = buffer_size; j < i; j++) free(arr[j]);
            // 可选:保留原数组或全部释放
            return;
        }
    }
    buffer_size = new_size; // 更新buffer_size
}

额外提示

  • 内存分配失败时必须做错误处理,避免内存泄漏或非法访问。
  • 永远不要直接将realloc的返回值赋值给原指针,否则分配失败时会丢失原指针,导致内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:35:13