如何在C++中正确使用realloc重新分配二维数组
二维数组realloc扩容的问题解决
问题根源
你的代码存在两个关键错误导致段错误:
- realloc大小计算错误:注释里的
realloc(arr, buffer_size * sizeof(int))误用了sizeof(int),但arr是int**类型,每个元素是int*指针,必须用sizeof(int*)计算空间,否则分配的内存不足以容纳新的指针数组,越界访问会触发段错误。 - 新扩容指针未初始化:即便修正了大小,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
相关产品推荐
相关产品推荐

