分段错误(核心转储 139)
Segmentation fault (core dumped 139)
我正在尝试制作一个动态二维数组(在这种情况下我几乎成功了)。我有一个 class ,其中包括一些构造函数、析构函数和其他处理矩阵算术运算的函数。所以这里是整个代码:
#include <iostream>
#include <stdint.h>
using namespace std;
int n,m,input,i,j;
class Matrix{
int **matrix;
int i,j,codeError;
public:
Matrix();
Matrix(int);
Matrix(int, int);
Matrix(const Matrix&, int, int);
~Matrix();
void setIJ(int, int);
int getIJ(int, int);
void set(int,int);
void position();
void plus(const Matrix&,const Matrix&,int, int);
void minus(const Matrix&,const Matrix&,int, int);
void multiply(const Matrix&,const Matrix&,int, int);
//void multiply(int,int,int);
void print(int, int);
};
Matrix a,b,c,d,e;
Matrix::Matrix(){
matrix=NULL;
i=0;
j=0;
}
Matrix::Matrix(int n){
matrix=new int*[n];
for(i=0;i<n;i++)
matrix[i]=new int[n];
for (int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j)
matrix[i][j]=1;
else matrix[i][j]=2;
}
}
}
Matrix::Matrix(int m, int n){
matrix=new int*[n];
for(i=0;i<n;i++)
matrix[i]=new int[m];
for (int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(i==j)
matrix[i][j]=0;
else matrix[i][j]=1;
}
}
}
Matrix::Matrix(const Matrix &obj,int n, int m)
{
matrix=new int*[n];
for(i=0;i<n;++i)
matrix[i]=new int[m];
for (int i=0;i<n;i++){
for (int j=0; j<n; j++){
matrix[i][j]=obj.matrix[i][j];
}
}
}
Matrix::~Matrix(){
delete [] matrix;
}
void Matrix::set(int n, int m){
matrix=new int*[n];
for(i=0;i<n;++i)
matrix[i]=new int[m];
for ( i=0;i<n;i++){
for( j=0;j<m;j++){
cin>>matrix[i][j];
}
}
}
void Matrix::setIJ(int i, int j){
int num;
cout<<"matrix[i][j]="<<endl;
cin>>num;
matrix[i][j]=num;
}
int Matrix::getIJ(int i, int j){
return matrix[i][j];
}
void Matrix::plus(const Matrix &obj,const Matrix &tmp,int n,int m){
matrix=new int*[n];
for(i=0;i<n;i++)
matrix[i]=new int [m];
for(i=0;i<n;i++){
for(j=0;j<m;j++){
matrix[i][j]=tmp.matrix[i][j]+obj.matrix[i][j];
}
}
}
void Matrix::minus(const Matrix &obj,const Matrix &tmp,int n,int m){
matrix=new int*[n];
for(i=0;i<n;i++)
matrix[i]=new int [m];
for(i=0;i<n;i++){
for(j=0;j<m;j++){
matrix[i][j]=tmp.matrix[i][j]-obj.matrix[i][j];
}
}
}
void Matrix::multiply(const Matrix &obj,const Matrix &tmp,int n,int m){
matrix=new int*[n];
for(i=0;i<n;i++)
matrix[i]=new int [m];
int temp1=0,temp2=0;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
for(int k=0;k<n;k++){
temp1=tmp.matrix[i][k];
temp2=obj.matrix[k][j];
matrix[i][j]+=temp1*temp2;
}
}
}
}
/*void Matrix::multiply(int n,int m,int scalar){
matrix=new int*[n];
for(i=0;i<n;i++)
matrix[i]=new int [m];
for(i=0;i<n;i++){
for(j=0;j<m;j++){
matrix[i][j]*=scalar;
}
}
}*/
void Matrix::print(int n, int m){
for(int i=0;i<n;i++){
cout<<endl;
for(int j=0;j<m;j++){
cout<<" "<<matrix[i][j];
}
}
}
int main(){
menu:
cout<<"menu"<<endl;
cout<<"1.Constructor without parameters"<<endl;
cout<<"2.Constructor 1 parameter"<<endl;
cout<<"3.Constructor 2 parameters"<<endl;
cout<<"4.copy constructor"<<endl;
cout<<"5.change number on IJ position"<<endl;
cout<<"6.what is the number on IJ position"<<endl;
cout<<"7.adition"<<endl;
cout<<"8.substraction"<<endl;
cout<<"9.multiply"<<endl;
cout<<"10.print"<<endl;
cin>>input;
switch(input){
case 1:{
Matrix a;
cout<<"write n si m"<<endl;
cin>>n>>m;
a.set(n,m);
goto menu;
}
case 2:{
Matrix b(3);
goto menu;
}
case 3:{
Matrix c(3,4);
goto menu;
}
case 4:{
Matrix d(a);
goto menu;
}
case 5:{
cout<<"write i,j"<<endl;
cin>>i>>j;
a.setIJ(i,j);
goto menu;
}
case 6:{
cout<<"itnrodu i,j"<<endl;
cin>>i>>j;
a.getIJ(i,j);
goto menu;
}
case 7:{
e.plus(a,d,n,m);
goto menu;
}
case 8:{
e.minus(a,d,n,m);
goto menu;
}
/*case 9:{
}*/
case 10:{
a.print(n,m);
b.print(3,3);
c.print(3,4);
d.print(n,m);
e.print(n,m);
goto menu;
}
}
}
所以在主函数中包含switch语句之前,通过手动调用每个函数,一切都运行正常。但是现在,我猜前 4 个 switch 语句工作正常,但是当我转到 5-10 个案例时,我得到了分段错误(核心转储 139)。我尝试调试代码,它告诉我问题总是在我将矩阵 [i][j] 分配给其他东西时出现,例如这里:
void Matrix::setIJ(int i, int j){
int num;
cout<<"matrix[i][j]="<<endl;
cin>>num;
**matrix[i][j]=num;**<-here
}
或此处:
void Matrix::plus(const Matrix &obj,const Matrix &tmp,int n,int m){
matrix=new int*[n];
for(i=0;i<n;i++)
matrix[i]=new int [m];
for(i=0;i<n;i++){
for(j=0;j<m;j++){
**matrix[i][j]=tmp.matrix[i][j]+obj.matrix[i][j];**<-here
}
}
}
我知道有些东西必须要有指针,但我仍然是编程方面的菜鸟,请帮助我
问题来了。您正在 case
的范围内创建 Matrix
个对象。但正如 Lightness Races in Orbit 所说:
[...] objects with automatic storage duration are not "leaked" when you goto
out of their scope
和:
[n3290: 6.6/2]: On exit from a scope (however accomplished), objects with automatic storage duration (3.7.3) that have been
constructed in that scope are destroyed in the reverse order of their
construction. [..]
因此,当 goto
完成并且您离开了 case
的范围时,在该范围下创建的 Matrix
个对象将被销毁。这就是为什么当你之后使用它时,你会得到一个 Segmentation fault (core dumped 139)
我正在尝试制作一个动态二维数组(在这种情况下我几乎成功了)。我有一个 class ,其中包括一些构造函数、析构函数和其他处理矩阵算术运算的函数。所以这里是整个代码:
#include <iostream>
#include <stdint.h>
using namespace std;
int n,m,input,i,j;
class Matrix{
int **matrix;
int i,j,codeError;
public:
Matrix();
Matrix(int);
Matrix(int, int);
Matrix(const Matrix&, int, int);
~Matrix();
void setIJ(int, int);
int getIJ(int, int);
void set(int,int);
void position();
void plus(const Matrix&,const Matrix&,int, int);
void minus(const Matrix&,const Matrix&,int, int);
void multiply(const Matrix&,const Matrix&,int, int);
//void multiply(int,int,int);
void print(int, int);
};
Matrix a,b,c,d,e;
Matrix::Matrix(){
matrix=NULL;
i=0;
j=0;
}
Matrix::Matrix(int n){
matrix=new int*[n];
for(i=0;i<n;i++)
matrix[i]=new int[n];
for (int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j)
matrix[i][j]=1;
else matrix[i][j]=2;
}
}
}
Matrix::Matrix(int m, int n){
matrix=new int*[n];
for(i=0;i<n;i++)
matrix[i]=new int[m];
for (int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(i==j)
matrix[i][j]=0;
else matrix[i][j]=1;
}
}
}
Matrix::Matrix(const Matrix &obj,int n, int m)
{
matrix=new int*[n];
for(i=0;i<n;++i)
matrix[i]=new int[m];
for (int i=0;i<n;i++){
for (int j=0; j<n; j++){
matrix[i][j]=obj.matrix[i][j];
}
}
}
Matrix::~Matrix(){
delete [] matrix;
}
void Matrix::set(int n, int m){
matrix=new int*[n];
for(i=0;i<n;++i)
matrix[i]=new int[m];
for ( i=0;i<n;i++){
for( j=0;j<m;j++){
cin>>matrix[i][j];
}
}
}
void Matrix::setIJ(int i, int j){
int num;
cout<<"matrix[i][j]="<<endl;
cin>>num;
matrix[i][j]=num;
}
int Matrix::getIJ(int i, int j){
return matrix[i][j];
}
void Matrix::plus(const Matrix &obj,const Matrix &tmp,int n,int m){
matrix=new int*[n];
for(i=0;i<n;i++)
matrix[i]=new int [m];
for(i=0;i<n;i++){
for(j=0;j<m;j++){
matrix[i][j]=tmp.matrix[i][j]+obj.matrix[i][j];
}
}
}
void Matrix::minus(const Matrix &obj,const Matrix &tmp,int n,int m){
matrix=new int*[n];
for(i=0;i<n;i++)
matrix[i]=new int [m];
for(i=0;i<n;i++){
for(j=0;j<m;j++){
matrix[i][j]=tmp.matrix[i][j]-obj.matrix[i][j];
}
}
}
void Matrix::multiply(const Matrix &obj,const Matrix &tmp,int n,int m){
matrix=new int*[n];
for(i=0;i<n;i++)
matrix[i]=new int [m];
int temp1=0,temp2=0;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
for(int k=0;k<n;k++){
temp1=tmp.matrix[i][k];
temp2=obj.matrix[k][j];
matrix[i][j]+=temp1*temp2;
}
}
}
}
/*void Matrix::multiply(int n,int m,int scalar){
matrix=new int*[n];
for(i=0;i<n;i++)
matrix[i]=new int [m];
for(i=0;i<n;i++){
for(j=0;j<m;j++){
matrix[i][j]*=scalar;
}
}
}*/
void Matrix::print(int n, int m){
for(int i=0;i<n;i++){
cout<<endl;
for(int j=0;j<m;j++){
cout<<" "<<matrix[i][j];
}
}
}
int main(){
menu:
cout<<"menu"<<endl;
cout<<"1.Constructor without parameters"<<endl;
cout<<"2.Constructor 1 parameter"<<endl;
cout<<"3.Constructor 2 parameters"<<endl;
cout<<"4.copy constructor"<<endl;
cout<<"5.change number on IJ position"<<endl;
cout<<"6.what is the number on IJ position"<<endl;
cout<<"7.adition"<<endl;
cout<<"8.substraction"<<endl;
cout<<"9.multiply"<<endl;
cout<<"10.print"<<endl;
cin>>input;
switch(input){
case 1:{
Matrix a;
cout<<"write n si m"<<endl;
cin>>n>>m;
a.set(n,m);
goto menu;
}
case 2:{
Matrix b(3);
goto menu;
}
case 3:{
Matrix c(3,4);
goto menu;
}
case 4:{
Matrix d(a);
goto menu;
}
case 5:{
cout<<"write i,j"<<endl;
cin>>i>>j;
a.setIJ(i,j);
goto menu;
}
case 6:{
cout<<"itnrodu i,j"<<endl;
cin>>i>>j;
a.getIJ(i,j);
goto menu;
}
case 7:{
e.plus(a,d,n,m);
goto menu;
}
case 8:{
e.minus(a,d,n,m);
goto menu;
}
/*case 9:{
}*/
case 10:{
a.print(n,m);
b.print(3,3);
c.print(3,4);
d.print(n,m);
e.print(n,m);
goto menu;
}
}
}
所以在主函数中包含switch语句之前,通过手动调用每个函数,一切都运行正常。但是现在,我猜前 4 个 switch 语句工作正常,但是当我转到 5-10 个案例时,我得到了分段错误(核心转储 139)。我尝试调试代码,它告诉我问题总是在我将矩阵 [i][j] 分配给其他东西时出现,例如这里:
void Matrix::setIJ(int i, int j){
int num;
cout<<"matrix[i][j]="<<endl;
cin>>num;
**matrix[i][j]=num;**<-here
}
或此处:
void Matrix::plus(const Matrix &obj,const Matrix &tmp,int n,int m){
matrix=new int*[n];
for(i=0;i<n;i++)
matrix[i]=new int [m];
for(i=0;i<n;i++){
for(j=0;j<m;j++){
**matrix[i][j]=tmp.matrix[i][j]+obj.matrix[i][j];**<-here
}
}
}
我知道有些东西必须要有指针,但我仍然是编程方面的菜鸟,请帮助我
问题来了。您正在 case
的范围内创建 Matrix
个对象。但正如 Lightness Races in Orbit 所说:
[...] objects with automatic storage duration are not "leaked" when you
goto
out of their scope
和:
[n3290: 6.6/2]: On exit from a scope (however accomplished), objects with automatic storage duration (3.7.3) that have been constructed in that scope are destroyed in the reverse order of their construction. [..]
因此,当 goto
完成并且您离开了 case
的范围时,在该范围下创建的 Matrix
个对象将被销毁。这就是为什么当你之后使用它时,你会得到一个 Segmentation fault (core dumped 139)