C++ c++;:初始化指针队列时获取segfault

C++ c++;:初始化指针队列时获取segfault,c++,initialization,queue,segmentation-fault,breadth-first-search,C++,Initialization,Queue,Segmentation Fault,Breadth First Search,我试图实现CLRS中描述的BFS算法。并具备以下条件: #include <iostream> #include <list> #include <queue> #include <string> #include <sstream> using namespace std; struct Node{ char colour; int numNbr; Node* parent; int distance;

我试图实现CLRS中描述的BFS算法。并具备以下条件:

#include <iostream>
#include <list>
#include <queue>
#include <string>
#include <sstream>
using namespace std;
struct Node{
    char colour;
    int numNbr;
    Node* parent;
    int distance;
    int* neighbours;
    int* costs;
    int name;
    Node(int _numNbr,int _name){
        name = _name;
        colour = 'w';
        parent = 0;
        distance = -1;
        neighbours = new int[_numNbr];
        costs      = new int[_numNbr];
        numNbr = _numNbr;
    }
};

list<Node*> bfs(Node** &nodes,int numNodes,int startNode) {
    cout << "performing BFS\n";
    for(int i = 0; i < numNodes;i++) {
        nodes[i]->colour = 'w';
        nodes[i]->parent = 0;
    }
    cout << "All nodes painted white" <<endl;
    queue<Node*> q; // segfault occurs here
    cout << "initialised a queue" << endl;
    list<Node*> l;
    cout << "initialised a list" << endl;
    nodes[startNode]->colour = 'g';
    nodes[startNode]->distance = 0;
    q.push(nodes[startNode]);
    Node* u;
    Node* v;
    while(!q.empty()){
        u = q.front();
        for(int i = 0;i < u->numNbr; i++) {
            v = nodes[u->neighbours[i]];
            if(v->colour == 'w'){
                v->colour = 'g';
                v->distance = (u->distance)+1;
                v->parent = u;
                q.push(v);
            }
        }
        l.push_front(u);
        u->colour = 'b';
        q.pop();
    }
    return l;
}

int main(){
    int nodeCount;
    cin >> nodeCount;
    cin.ignore();
    Node** nodes = new Node*[nodeCount+1];
    for(int i = 0; i < nodeCount; i++){
        .... // build up the nodes in the adjacency list
    }
    list<Node*> l = bfs(nodes,nodeCount,1);
    cout << "BFS of nodes\n";
    for(list<Node*>::iterator it = l.begin();it != l.end();it++){
        cout << (*it)->name << " ";
    }
    cout << endl;
    return 0;
}
我正在使用以下命令进行编译:

g++ -Wall  -o dijkstra dijkstra.cpp
此外,此处无需参考:

Node** &nodes
你指的地方没有出现断层。I/O缓冲区并没有因为它而被填满,它是这样的

cout << "initialised a queue" << endl;
list<Node*> l;
cout << "initialised a list" << endl;

无法使用调试器并执行堆栈跟踪。根据:如果您在创建队列容器时遇到segfault,那么堆很可能已损坏。您对创建邻接列表有意见,但这可能就是问题所在。您正在分配一个节点数组,但您也在分配单个节点吗?有关样式的注释:使用变量名“l”(小写l)只会导致混淆(因为每个人都会认为它是“1”(第一)。因此,请帮自己一个忙,使用另一个名称。OP声明了一个名为“l”(小写l)的局部变量,该变量返回,而不是“1”(数字1)。问题在于将节点涂成白色时循环计数器。我从0开始,但没有名为0的节点!将其初始化为1修复了该问题。
return l;
Node** &nodes
cout << "initialised a queue" << endl;
list<Node*> l;
cout << "initialised a list" << endl;