我正在尝试编写一个程序,该程序将使用类和树来解决迷宫。我正在尝试使用一个类来表示迷宫(将使用cin输入设计),并且该类包含一个结构作为私有成员。
此结构包含两个int(用于位置的x和y坐标)和一个包含3个空格的数组,该数组将包含指向其他结构的三个指针。
在我的类的构造函数中,我试图将数组中的所有指针设置为NULL以启动。程序编译得很好,但当我到达构造函数时,程序会给我一个分段错误。以下是一些相关代码:
const int POSSIBLE_BRANCHES = 3; //at any point the path can split in 3 ways
struct PathNode
{
int x_coord;
int y_coord;
PathList branches[POSSIBLE_BRANCHES];
};
typedef PathNode *PathList;
class Maze
{
private:
PathList initial_pos;
public:
Maze();
};
构造函数:
Maze::Maze()
{
cout << "entered constructor" << endl;
for (int i = 0; i < POSSIBLE_BRANCHES; i++)
{
initial_pos->branches[i] = NULL;
}
}
我打印出了"输入的构造函数"短语,但程序随后立即停止。我认为这是指针语法的一些愚蠢问题,但我一直无法找到问题所在。
据我所知:->运算符取消引用指向PathNode结构的指针,因此现在我们可以访问x_coord、y_coord和分支等成员。[]运算符获取分支数组的每个索引。因为它是指向PathNodes的指针数组,所以将它们设置为NULL应该没问题。我推理的缺陷在哪里?
编辑:已解决。查看标记为最佳的答案。
在使用initial_pos之前,您还没有分配它。这导致了segfault。大致如下:
Maze::Maze()
: initial_pos(new PathNode)
{
cout << "entered constructor" << endl;
for (int i = 0; i < POSSIBLE_BRANCHES; i++)
{
initial_pos->branches[i] = NULL;
}
}
应该可以解决你的问题。
您的构造函数是为新类调用的第一个对象,因此您永远不会在中分配或初始化initial_pos
,但随后会取消引用它,从而导致未定义的行为(很可能导致segfault)