分段错误(核心已转储)- 二维数组
Segmentation fault (core dumped) - Two dimensional array
我对这段代码有疑问:
1) Segmentation fault in cpp object.
相同的代码适用于 main
函数。
// Create
vector< vector<int> > vec(4, vector<int>(4));
// Write
vec[2][3] = 10;
// Read
int a = vec[2][3];
我创建了一个二维数组元素。内存分配有问题。不知道怎么处理。
#include <iostream>
#include <vector>
using namespace std;
class Matrix
{
public:
int m, n;
Matrix();
Matrix(int, int);
vector<vector<int> > vec;
};
int main()
{
Matrix obj(3, 4);
obj.vec[1][2] = 33;
return 0;
}
Matrix::Matrix()
{
n = 0;
m = 0;
vector< vector<int> > vec(m, vector<int>(n));
}
Matrix::Matrix(int m, int n)
{
this->m = m;
this->n = n;
vector< vector<int> > vec(m, vector<int>(n));
}
您没有分配 Matrix
class 的 vec
成员,而是在 Matrix
的构造函数中引入了局部 std::vector<std::vector<int>> vec
,它只有构造函数中的生命周期。
您应该 std::vector::resize
使用 m
和 n
传递给成员 vec
。
Matrix::Matrix(int m, int n)
{
this->m = m;
this->n = n;
vec.resize(m, std::vector<int>(n));
}
或使用constructor member initializer lists初始化vec
.
Matrix::Matrix(int m, int n)
: m{ m }
, n{ n }
, vec(m, std::vector<int>(n))
{}
旁注:
为成员和构造函数参数使用不同的名称,以避免混淆。
不要用using namespace std;
练习。
例如:
#include <vector>
class Matrix /* final */
{
int mRow, mCol;
std::vector<std::vector<int>> mStorage;
public:
Matrix(int m, int n) // different name as the members
: mRow{ m }
, mCol{ n }
, mStorage(mRow, std::vector<int>(mCol))
{}
};
我对这段代码有疑问:
1) Segmentation fault in cpp object.
相同的代码适用于 main
函数。
// Create
vector< vector<int> > vec(4, vector<int>(4));
// Write
vec[2][3] = 10;
// Read
int a = vec[2][3];
我创建了一个二维数组元素。内存分配有问题。不知道怎么处理。
#include <iostream>
#include <vector>
using namespace std;
class Matrix
{
public:
int m, n;
Matrix();
Matrix(int, int);
vector<vector<int> > vec;
};
int main()
{
Matrix obj(3, 4);
obj.vec[1][2] = 33;
return 0;
}
Matrix::Matrix()
{
n = 0;
m = 0;
vector< vector<int> > vec(m, vector<int>(n));
}
Matrix::Matrix(int m, int n)
{
this->m = m;
this->n = n;
vector< vector<int> > vec(m, vector<int>(n));
}
您没有分配 Matrix
class 的 vec
成员,而是在 Matrix
的构造函数中引入了局部 std::vector<std::vector<int>> vec
,它只有构造函数中的生命周期。
您应该 std::vector::resize
使用 m
和 n
传递给成员 vec
。
Matrix::Matrix(int m, int n)
{
this->m = m;
this->n = n;
vec.resize(m, std::vector<int>(n));
}
或使用constructor member initializer lists初始化vec
.
Matrix::Matrix(int m, int n)
: m{ m }
, n{ n }
, vec(m, std::vector<int>(n))
{}
旁注:
为成员和构造函数参数使用不同的名称,以避免混淆。
不要用
using namespace std;
练习。
例如:
#include <vector>
class Matrix /* final */
{
int mRow, mCol;
std::vector<std::vector<int>> mStorage;
public:
Matrix(int m, int n) // different name as the members
: mRow{ m }
, mCol{ n }
, mStorage(mRow, std::vector<int>(mCol))
{}
};