为什么C++在乘以大于 590x590 大小的矩阵时出现分割错误?

Why C++ gives segmentation fault when multiplying matrices more than size of 590x590?

本文关键字:错误 分割 C++ 大于 590x590 为什么      更新时间:2023-10-16

声明c++ 2d 数组的最佳方法是什么,这些数组可能因固定和有限的堆栈大小而产生较小的影响。由于以下代码中的堆栈溢出,我最近遇到了分段错误。 载体如何解决这个问题?

这是我开发的代码。

#include <iostream>
#include <stdlib.h>
using namespace std;
void printMatrix(double *mat);
void generateMat(double *mat);
void multiplyMat(double *a,double *b,double *c);
int n;
int start_s;
// the code you wish to time goes here
int stop_s;

int main(){ 
for(int i=500;i<1000;i++){
cout<< "Enter n:";
//cin >> n;
n=i;
cout<< "n="<<n<<endl;
double a[n][n],b[n][n],c[n][n]; //c = a * b, c is the
// result matrix
generateMat(*a);
generateMat(*b);
// initializing c matrix with 0s'
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
c[i][j]=0;
}
}
cout<<"Matrix 1"<<endl;
//printMatrix(*a);
cout<<endl<<"Matrix 2"<<endl;
//printMatrix(*b);
multiplyMat(*a,*b,*c);
cout<<endl<<"Result Matrix"<<endl;
//printMatrix(*c);
cout << endl<<"Execution time: " << (stop_s-start_s)/double(CLOCKS_PER_SEC)*1000 << endl;
}
return 0;
}
void multiplyMat(double *a,double *b,double* c){
start_s=clock();
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
for(int k=0;k<n;k++){
*(c+i*n+j)+=(*(a+i*n+k)) * (*(b+k*n+j));
}
}
}
stop_s=clock();
}
void printMatrix(double *mat){
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
cout<< *(mat+i*n+j)<< " ";
}
cout<<endl;
}
}
void generateMat(double *mat){
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
*(mat+i*n+j)=(double)rand()/RAND_MAX*10;
}
}
}

您的矩阵正在使用本地调用堆栈上的空间(通常限制为一兆字节或几兆字节)。

您应该考虑为它们创建一个class,它使用堆分配的数据(并在析构函数中释放它)。这个答案是针对 C,不是C++,但应该是鼓舞人心的(只需以真正的C++重新编码,也许使用智能指针和/或一些标准容器C++)。

你可以用一些内部std::vector数据来表示一个矩阵,并提供操作(即成员函数)来调整该矩阵的大小,并访问或修改其索引元素i&j