C++代码的问题求解
一时无聊做了个小程序 但是突然遇到个完全无力解决的问题。求指教。
头文件如下
class matrix
{
public:
matrix() {}
int **getmatrix();
int getline() {return line;}
int getrow() {return row;}
private:
int line, row;
};
void multiplication();
函数定义文件如下
#include <iostream>
#include "head.h"
using namespace std;
int ** matrix::getmatrix()
{
int i, j, line, row;
cout<<"请输入矩阵的行列数:";
cin>>line>>row;
this->line = line;
this->row = row;
cout<<"请输入矩阵的各元素:"<<endl;
int **p = NULL;
p = new int * [row];
for(i=0; i < row; i++)
p[i] = new int[line];
for(i=0; i < line; i++)
{
for(j=0; j < row; j++)
cin>>p[i][j];
}
cout<<"矩阵已创建"<<endl;
return p;
}
void multiplication()
{
matrix mat1;
int **p1 = NULL, **p2 = NULL;
p1 = mat1.getmatrix();
matrix mat2;
p2 = mat2.getmatrix();
if(mat1.getrow() != mat2.getline())
{
cout<<"矩阵1的行数不等于矩阵2的列数,无法相乘"<<endl;
exit(0);
}
else
{
int s = mat1.getrow(), i, j,k;
int **p = new int * [mat2.getrow()];
for(i=0; i < mat2.getrow(); i++)
p[i] = new int[mat1.getline()];
for(i=0; i < mat1.getline(); i++)
{
for(j=0; j < mat2.getrow(); j++)
{
p[i][j] = 0;
for(k=0; k < s; k++)
p[i][j] += p1[i][k] * p2[k][j];
}
}
cout<<"两矩阵的乘积为:"<<endl;
for(i=0; i < mat1.getline(); i++)
{
for(j=0; j < mat2.getrow(); j++)
cout<<p[i][j]<<" ";
cout<<endl;
}
delete[] p;
}
delete[] p1;
delete[] p2;
}
主函数文件
#include <iostream>
#include "head.h"
using namespace std;
extern void transposition(int line, int row, int **p);
extern void multiplication();
void main()
{
multiplication();
}
当我创建一个2*3矩阵和3*2矩阵的时候,第二个要报内存方面的错
错误为 Unhandled exception in xxx.exe:0xC0000005:Access Violation
[解决办法]
p是一次性new得到的,属于连续空间
[解决办法]
for(i=0; i < line; i++)
{
for(j=0; j < row; j++)
cin>>p[i][j];
}
看你之前的代码应该是row代表行吧line代表列吧,可是你的这个输入循环好像翻过来了吧。会不会是这个的错误呢。你的动态内存分配没问题
[解决办法]
初步来看,你在 getmatrix 函数内部把行和列搞反了,从而造成了p[i][j] 越界。应为:
[code=c++]
p = new int * [line];
for(i=0; i < row; i++)
p[i] = new int[row];
[/code]
[解决办法]
另外关于二维动态数组的实现,可以参考 http://blog.csdn.net/zhcosin/article/details/8275603