声明c ++ 2d数组的最佳方法是什么,它对固定和有限的堆栈大小的影响较小。我最近因以下代码中的stackoverflow而出现分段错误。 向量如何解决这个问题?
这是我开发的代码。
#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;
}
}
}
答案 0 :(得分:4)
您的矩阵正在使用本地call stack上的空间(通常限制为一个或几个兆字节)。
您应该考虑为它们创建一个class
,它使用堆分配的数据(并在析构函数中释放它)。
您可以表示具有一些内部std::vector数据的矩阵,并提供操作(即成员函数)来调整该矩阵的大小并访问或修改其索引元素 i &amp; Ĵ