C++ 从导入的queue.front()中获取奇怪的seg错误
因此,我目前正在为我的CS163类开发一个图形抽象数据类型。除了图形的深度优先遍历之外,这个程序的其他功能都非常棒。测试时,我添加所有需要的顶点,然后根据需要连接它们。我检查了一下,所有的事情都联系在一起了,所以我们可以走了。我跳转到下面的函数中,给定要开始的朋友(顶点)的名称。我注释的行“*current_buddy=myQueue.front();”是我在GDB中发现的导致seg故障的错误代码。同样使用GDB,我能够使用“p myQueue.front()”成功地打印正确的顶点 因此,也许需要一个示例测试来提供更多的上下文。假设我有a点,b点,c点,d点和e点。a连接到c、d和e。b连接到c。我想从顶点“a”开始测试。将a传递给函数,它使用find_location函数查找适当的索引,该函数只返回所述索引整数。然后,它会将该顶点推送到队列上,并将该顶点标记为已访问,以便在遍历时,我不会返回到该点再次将其推送到队列上。我创建一个节点“current”,该节点附着到“a”顶点的边列表中的第一个节点。当它进入第一个循环时,我使用先前创建的顶点“current_buddy”指向队列中的第一个对象,即顶点“a”。这是程序遇到seg故障的点,我一辈子都无法弄清楚这一行代码会发生什么 “顶点”和“节点”都是我创建的结构,我使用的队列来自标准库#包含队列任何和所有信息都将不胜感激!显然,由于这是一项学校作业,我不希望任何人给我答案,但我现在迷路了C++ 从导入的queue.front()中获取奇怪的seg错误,c++,algorithm,segmentation-fault,breadth-first-search,C++,Algorithm,Segmentation Fault,Breadth First Search,因此,我目前正在为我的CS163类开发一个图形抽象数据类型。除了图形的深度优先遍历之外,这个程序的其他功能都非常棒。测试时,我添加所有需要的顶点,然后根据需要连接它们。我检查了一下,所有的事情都联系在一起了,所以我们可以走了。我跳转到下面的函数中,给定要开始的朋友(顶点)的名称。我注释的行“*current_buddy=myQueue.front();”是我在GDB中发现的导致seg故障的错误代码。同样使用GDB,我能够使用“p myQueue.front()”成功地打印正确的顶点 因此,也许需
bool graph::breadth_first(char * start)
{
if(adjacency_list[0].buddy_name == NULL)
return false;
int location = find_location(start);
queue<vertex> myQueue;
myQueue.push(adjacency_list[location]);
adjacency_list[location].visited = true;
node * current = adjacency_list[location].head;
vertex * current_buddy = NULL;
while(myQueue.empty() == false)
{
*current_buddy = myQueue.front();//THIS LINE SEG FAULTS
cout << "THIS IS A FRIEND IN THE BREADTH-FIRST TRAVERSAL" << current_buddy->buddy_name << endl;
current = current_buddy->head;
myQueue.pop();
while(current != NULL)
{
if(current->connected_buddy->visited == false)
{
current_buddy = current->connected_buddy;
location = find_location(current_buddy->buddy_name);
myQueue.push(adjacency_list[location]);
adjacency_list[location].visited = true;
current = current->next;
}
}
}
for(int i = 0; adjacency_list[i].buddy_name != NULL; ++i)
{
adjacency_list[i].visited = false;
}
return true;
}
bool图::宽度优先(char*start)
{
if(邻接列表[0]。好友名称==NULL)
返回false;
int location=查找位置(开始);
队列myQueue;
push(邻接列表[位置]);
邻接列表[位置]。已访问=真;
节点*当前=邻接列表[位置]。头部;
顶点*current_buddy=NULL;
while(myQueue.empty()==false)
{
*current_buddy=myQueue.front();//此行分段错误
无法连接(好友->已访问==错误)
{
当前好友=当前->已连接好友;
位置=查找位置(当前好友->好友姓名);
push(邻接列表[位置]);
邻接列表[位置]。已访问=真;
当前=当前->下一步;
}
}
}
对于(int i=0;邻接列表[i]。好友名称!=NULL;++i)
{
邻接列表[i]。访问=假;
}
返回true;
}
我不知道这是否会像您预期的那样起作用,但一个快速解决方法可能是使用操作数的地址并实际分配指针,而不是取消对它的引用:
current_buddy = &myQueue.front();
我不知道这是否会像您预期的那样工作,但一个快速解决方法可能是使用操作数的地址并实际分配指针,而不是取消对它的引用:
current_buddy = &myQueue.front();
(编辑:对于问题的第一部分,Joachim提供的解决方案/答案可能会更好。我只是希望尽可能避免使用指针。)
你可以试试:
vertex * current_buddy = NULL;
while(myQueue.empty() == false)
{
vertex front_buddy = myQueue.front();
cout << "THIS IS A FRIEND IN THE BREADTH-FIRST TRAVERSAL" << front_buddy.buddy_name << endl;
current = front_buddy.head;
这样你就不会再撞车了
这部分
while(current != NULL)
{
if(current->connected_buddy->visited == false)
{
// your code
current = current->next;
}
}
如果current->connected\u buddy->visted
为真,看起来就像一个无休止的循环
也许你想要
while(current != NULL)
{
if(current->connected_buddy->visited == false)
{
// your code
}
// Moved out of the if-statement
current = current->next;
}
(编辑:对于问题的第一部分,Joachim提供的解决方案/答案可能会更好。我只是希望尽可能避免使用指针。)
你可以试试:
vertex * current_buddy = NULL;
while(myQueue.empty() == false)
{
vertex front_buddy = myQueue.front();
cout << "THIS IS A FRIEND IN THE BREADTH-FIRST TRAVERSAL" << front_buddy.buddy_name << endl;
current = front_buddy.head;
这样你就不会再撞车了
这部分
while(current != NULL)
{
if(current->connected_buddy->visited == false)
{
// your code
current = current->next;
}
}
如果current->connected\u buddy->visted
为真,看起来就像一个无休止的循环
也许你想要
while(current != NULL)
{
if(current->connected_buddy->visited == false)
{
// your code
}
// Moved out of the if-statement
current = current->next;
}
这是segfault,因为您正试图遵从空指针
vertex * current_buddy = NULL;
while(myQueue.empty() == false)
{
// V de-referencing a NULL pointer
*current_buddy = myQueue.front();//THIS LINE SEG FAULTS
你应该把它改成
// vertex * current_buddy = NULL; // < Remove this line
while(myQueue.empty() == false)
{
vertex *current_buddy = &myQueue.front();
//顶点*current\u buddy=NULL;//<删除此行
while(myQueue.empty()==false)
{
顶点*current_buddy=&myQueue.front();
这是SEGFULT,因为您试图遵从空指针
vertex * current_buddy = NULL;
while(myQueue.empty() == false)
{
// V de-referencing a NULL pointer
*current_buddy = myQueue.front();//THIS LINE SEG FAULTS
你应该把它改成
// vertex * current_buddy = NULL; // < Remove this line
while(myQueue.empty() == false)
{
vertex *current_buddy = &myQueue.front();
//vertex*current\u buddy=NULL;//<删除此行
while(myQueue.empty()==false)
{
顶点*current_buddy=&myQueue.front();
看看崩溃的那一行上面的几行,您将当前好友初始化为空指针。现在想想当您尝试取消引用空指针时会发生什么……这是我试图为我的测试添加一致性时所做的编辑:/即使我最初没有将其设置为空,它仍然会产生相同的问题hy是一个指针吗?它不应该只是一个顶点吗?它是指向顶点对象的指针。我的想法是让它指向myQueue.front()的顶点通过引用返回,如果不初始化变量,则其值将是不确定的,并且在尝试取消引用指针时仍有UB。请查看崩溃指针上方的几行,在该行中,您将当前好友初始化为空指针。现在想想当您尝试取消引用空指针时会发生什么…这是我试图在测试中添加一些一致性的编辑:/即使我最初没有将其设置为NULL,它仍然会产生相同的问题为什么current\u buddy
是指针?它不应该只是一个顶点吗?它是指向顶点对象的指针。我的想法是,我会让它指向我队列中的顶点。front()通过引用返回,如果不初始化变量,其值将是不确定的,并且在尝试取消引用指针时仍有UB。这确实起到了作用!尽管现在我似乎正在检查while循环的seg错误,以检查current!=NULL。我不确定