C++ 使用c+创建大型2d动态阵列时出现分段错误(堆芯转储)+;
我正在尝试创建一个程序,创建两个二维动态数组,并将它们相乘,然后给出一个输出,并根据输入大小n计算相乘过程所需的时间。当输出小于7行和7列时,此代码有效,但当数字超过8时,会出现错误C++ 使用c+创建大型2d动态阵列时出现分段错误(堆芯转储)+;,c++,arrays,segmentation-fault,dynamic-arrays,coredump,C++,Arrays,Segmentation Fault,Dynamic Arrays,Coredump,我正在尝试创建一个程序,创建两个二维动态数组,并将它们相乘,然后给出一个输出,并根据输入大小n计算相乘过程所需的时间。当输出小于7行和7列时,此代码有效,但当数字超过8时,会出现错误 using namespace std; int m1c , m1r , m2c , m2r , i , j , k , l; int** arr1 = new int*[m1c]; int** arr2 = new int*[m2c]; int** multArr = new int*[m1c]; int
using namespace std;
int m1c , m1r , m2c , m2r , i , j , k , l;
int** arr1 = new int*[m1c];
int** arr2 = new int*[m2c];
int** multArr = new int*[m1c];
int main(){
cout << "Enter the Number of rows for matrix 1 :";
cin >> m1c;
cout << "Enter the Number of columns for matrix 1 :";
cin >> m1r;
cout << "Enter the Number of rows for matrix 2 :";
cin >> m2c;
cout << "Enter the Number of columns for matrix 2 :";
cin >> m2r;
for (i = 0; i < m1r; i++) {
arr1[i] = new int[m1c];
multArr[i] = new int[m1c];
}
for (i = 0; i < m2r; i++) {
arr2[i] = new int[m2c];
}
if (m1r != m2c) {
cout << "Number of rows in the first matrix must be equal to the numbr of columns in the second matrix ";
return -1;
}
for (i = 0; i < m1r; i++) {
for (j = 0; j < m2c; j++) {
arr1[i][j] = rand() % 100;
}
}
for (i = 0; i < m2r; i++) {
for (j = 0; j < m2c; j++) {
arr2[i][j] = rand() % 100;
}
}
//Displaying the two arrays
for (i = 0; i < m1r; i++) {
for (j = 0; j < m1c; j++) {
cout << arr1[i][j] << " ";
}
cout << endl;
}
cout << endl;
for (i = 0; i < m2r; i++) {
for (j = 0; j < m2c; j++) {
cout << arr2[i][j] << " ";
}
cout << endl;
}
delete[] arr1;
delete[] arr2;
return 0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
使用名称空间std;
int m1c,m1r,m2c,m2r,i,j,k,l;
int**arr1=新int*[m1c];
int**arr2=新int*[m2c];
int**multArr=新int*[m1c];
int main(){
cout>m1c;
cout>m1r;
cout>m2c;
cout>m2r;
对于(i=0;i cout初始化arr1时看起来像是一个错误。您使用m2c作为列计数。您可能是指m1c。旁注:这有std::vector
。只需使用std::vector
即可。int**arr1=new int*[m1c]此时m1c
是0
,因此分配了一个大小为零的数组。那么,std::vector
对于大量数据(矩阵)的伸缩性不好,通常最好将std::vector
封装在一个类中,该类执行如何按行和列索引寻址的逻辑。在接受其值之前,您将arr1和arr2分配给大小为m1c和m2c的类。更糟糕的是,您没有初始化m1c和m2c,因此它们可能包含垃圾。[IIRC,VS将在编译为调试时将其初始化为零,在编译为发布时将其保持未初始化状态。]访问超出分配范围的arr1和arr2元素可能是分段错误的原因。此外,内存泄漏-删除arr1和arr2,但不删除每个元素分配的内存。