为什么C++在乘以大于 590x590 大小的矩阵时出现分割错误?
Why C++ gives segmentation fault when multiplying matrices more than size of 590x590?
声明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
。相关文章:
- C++映射分割错误(核心转储)
- 由cin中的字符串中未捕获空白引起的分割错误
- 删除映射和分割错误中的一个过去结束元素
- 在指向函数中读取变量时出现分割错误
- 在链表中的第 n 位插入显示分割错误
- 较高值 n 的分割错误(例如 n=999997)
- 尝试通过memcpy复制大尺寸浮点向量时的分割错误
- 分割错误:向量中的擦除功能
- 向量向量的分割错误
- 我在C++中编写了一个方法来打印树类的预序,但它显示了分割错误
- C ++分割错误,为什么使用"long long"我没有得到答案?
- 在尝试使用递归查找集合子集的总数时,我遇到了分割错误
- 分割错误 11:尝试使用 cin 输入 B[1] 时
- 集合布局上的 Qt 分割错误
- 高达20亿的筛子会产生分割错误
- G :内部编译器错误:分割故障(程序CC1PLUS) - 我在哪里开始
- 二进制搜索树操作程序错误:分割故障(核心倾倒)
- 在给出正确的输出后,给出错误分割错误(核心转储)
- 得到错误分割错误(核心转储)进程返回139 (0x8B)
- 内部编译错误:分割错误在gcc.发送可变模板到struct时