为什么 C++ 在乘以大于 590x590 的矩阵时会出现分段错误?
Why C++ gives segmentation fault when multiplying matrices more than size of 590x590?
声明 C++ 二维数组的最佳方法是什么,它可以减少固定和有限堆栈大小的影响。由于以下代码中的计算器溢出,我最近遇到了分段错误。
向量如何解决这个问题?
这是我开发的代码。
#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;
}
}
}
您的矩阵在本地 call stack(通常限制为一或几兆字节)上使用 space。
你应该考虑为他们做一个class
,它使用堆分配的数据(并在析构函数中释放它)。 is for C, not C++, but should be inspirational (just recode it in genuine C++, perhaps using smart pointers and/or some C++ standard container[s]).
您可以用一些内部 std::vector 数据表示一个矩阵,并提供操作(即成员函数)来调整该矩阵的大小并访问或修改其索引元素 i & j
声明 C++ 二维数组的最佳方法是什么,它可以减少固定和有限堆栈大小的影响。由于以下代码中的计算器溢出,我最近遇到了分段错误。 向量如何解决这个问题?
这是我开发的代码。
#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;
}
}
}
您的矩阵在本地 call stack(通常限制为一或几兆字节)上使用 space。
你应该考虑为他们做一个class
,它使用堆分配的数据(并在析构函数中释放它)。
您可以用一些内部 std::vector 数据表示一个矩阵,并提供操作(即成员函数)来调整该矩阵的大小并访问或修改其索引元素 i & j