我正在开发一个项目,我正在尝试构建一个节点数组作为堆,这样在数组的每个索引中,我都可以存储一个名称和值。基本上我希望我的构造函数将第一个索引的值设置为-1,这样我就可以判断它以后是否为空(值为-1表示空索引)。
问题在于我遇到了一个段错,我不知道为什么。这是错误的代码:
标题文件:
class tripe
{
public:
tripe();
void initialize(string filename); //initialize tripe data struct
void insert(string name, int grade); //insert given pair into structure
void search(string prefix); //print list of entries that matches prefix
void findMin(); //print min grade entry
void buildheap(string name,string grade,int size);
heapnode *heap[100]; //TROUBLESOME VARIABLE
trinode *head;
trinode *let[25];
};
class heapnode
{
public:
string student;
int score; //WANT THIS TO BE -1 FOR FIRST INDEX OF HEAP ARRAY
};
C ++文件:
tripe::tripe()
{
for (int i = 0; i < 100; i++)
{
heap[i] = NULL;
}
heap[1]->score = -1; //SEG FAULT
}
事实上我已经注意到无论何时尝试访问堆数组中的得分变量,我都会得到一个segault。我的构造函数是否需要做其他事情?任何有关此问题的帮助将不胜感激!
P.S。我需要为这个项目使用一个节点数组,所以我的堆的实现不能改变。
答案 0 :(得分:0)
您正在堆[1]中存储NULL。间接通过NULL时,会出现分段错误。这就是应该发生的事情。 heap不是节点数组,而是指向节点的指针数组。如果这是故意的,那么在实际使用这些指针之前,必须为指向这些指针的指针分配一些内存。既然你说你需要使用“节点数组”,我猜这是真的,因此你需要将你的声明更改为heapnode类型的数组:
heapnode heap[100];
然后您的构造函数可能如下所示:
tripe::tripe()
{
for (int i = 0; i < 100; i++)
{
heap[i].score = -1;
}
}
显然,对堆中节点的任何其他引用都必须更改为使用“。”。运算符而不是“ - &gt;”。