C++创建大尺寸二维动态数组时触发段错误(核心转储)问题排查
问题分析与修复方案
我帮你仔细排查了代码里的问题,导致段错误(尤其是矩阵尺寸超过7时崩溃)的原因主要有几个关键错误,我来逐个拆解并给出修复后的完整代码:
1. 全局变量未初始化就分配内存
你把m1c、m1r这些矩阵尺寸变量声明为全局变量,C++里全局int的默认初始值是0。这意味着你在main()函数执行前就已经运行了:
int** arr1 = new int*[m1c]; // m1c此时是0,分配了一个空的指针数组
等用户输入真实的矩阵尺寸后,arr1的大小还是0,后续循环给arr1[i]分配内存时,本质是在访问空数组的越界位置——小尺寸时可能刚好没踩到非法内存,尺寸变大后必然触发段错误。
2. 矩阵行和列的变量完全搞混
你输入时的变量命名完全颠倒了:
cout << "Enter the Number of rows for matrix 1 :"; cin >> m1c; // 把行数存在了带"c"(column)的变量里 cout << "Enter the Number of columns for matrix 1 :"; cin >> m1r; // 把列数存在了带"r"(row)的变量里
这种混乱导致后续数组分配、循环边界全部错误,进一步加剧了内存越界问题。
3. 提前释放数组且乘法逻辑缺失
你在还没执行矩阵乘法时就delete[] arr1; delete[] arr2;,而且用来存结果的multArr既没正确分配也没使用,完全没实现核心的乘法功能。
4. 其他小问题
rand()未初始化随机种子,每次运行生成的随机数完全相同;- 动态分配的内存未完整释放,存在内存泄漏。
修正后的完整代码
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main(){ int rows1, cols1, rows2, cols2; // 输入矩阵尺寸,用清晰的变量名避免混淆 cout << "Enter the Number of rows for matrix 1 : "; cin >> rows1; cout << "Enter the Number of columns for matrix 1 : "; cin >> cols1; cout << "Enter the Number of rows for matrix 2 : "; cin >> rows2; cout << "Enter the Number of columns for matrix 2 : "; cin >> cols2; // 先检查矩阵乘法合法性:矩阵1的列数必须等于矩阵2的行数 if (cols1 != rows2) { cout << "Error: Columns of matrix 1 must equal rows of matrix 2!" << endl; return -1; } // 初始化随机种子,让每次生成的随机数不同 srand(time(nullptr)); // 动态分配矩阵1:rows1行,cols1列 int** arr1 = new int*[rows1]; for (int i = 0; i < rows1; i++) { arr1[i] = new int[cols1]; // 填充0-99的随机数 for (int j = 0; j < cols1; j++) { arr1[i][j] = rand() % 100; } } // 动态分配矩阵2:rows2行,cols2列 int** arr2 = new int*[rows2]; for (int i = 0; i < rows2; i++) { arr2[i] = new int[cols2]; for (int j = 0; j < cols2; j++) { arr2[i][j] = rand() % 100; } } // 动态分配结果矩阵:rows1行,cols2列,初始化为0 int** multArr = new int*[rows1]; for (int i = 0; i < rows1; i++) { multArr[i] = new int[cols2](); } // 显示原始矩阵1 cout << "\nMatrix 1:" << endl; for (int i = 0; i < rows1; i++) { for (int j = 0; j < cols1; j++) { cout << arr1[i][j] << " "; } cout << endl; } // 显示原始矩阵2 cout << "\nMatrix 2:" << endl; for (int i = 0; i < rows2; i++) { for (int j = 0; j < cols2; j++) { cout << arr2[i][j] << " "; } cout << endl; } // 执行矩阵乘法并计时 clock_t start = clock(); for (int i = 0; i < rows1; i++) { for (int j = 0; j < cols2; j++) { for (int k = 0; k < cols1; k++) { multArr[i][j] += arr1[i][k] * arr2[k][j]; } } } clock_t end = clock(); double elapsed_time = double(end - start) / CLOCKS_PER_SEC; // 显示结果矩阵 cout << "\nResult Matrix (Multiplication):" << endl; for (int i = 0; i < rows1; i++) { for (int j = 0; j < cols2; j++) { cout << multArr[i][j] << " "; } cout << endl; } // 输出乘法耗时 cout << "\nTime taken for multiplication: " << elapsed_time << " seconds" << endl; // 完整释放动态内存:先释放每行,再释放指针数组 for (int i = 0; i < rows1; i++) { delete[] arr1[i]; delete[] multArr[i]; } delete[] arr1; delete[] multArr; for (int i = 0; i < rows2; i++) { delete[] arr2[i]; } delete[] arr2; return 0; }
关键修复说明
- 把所有变量移到
main()内,避免全局变量未初始化的问题,同时用rows1、cols1这种清晰命名彻底解决行/列混淆; - 先检查矩阵乘法合法性,再分配内存,避免无效操作;
- 正确实现二维动态数组的分配逻辑,严格遵循“先分配行指针数组,再给每行分配列内存”的规则;
- 添加了矩阵乘法核心逻辑,并通过
clock()实现计时功能; - 完整释放所有动态分配的内存,避免内存泄漏;
- 初始化随机种子,让每次运行生成的随机数不同。
内容的提问来源于stack exchange,提问作者Rashmika97
相关产品推荐
相关产品推荐

