这是怎么引起段错误的(短代码)(C语言)

How is this causing segmentation fault (short code) (C-language)

这导致了我的分段错误,每当我注释掉 breadthFirst = queue_enqueue(breadthFirst,n) 或 breadthFirst = queue_dequeue(breadthFirst) 我不再遇到段错误但它显然不能'不再解决我的任务了。

我想可能很难帮我解决这个问题,除非你知道数据类型是如何实现的,但我想我可以试一试,看看我是否遗漏了一些明显的东西。

bool find_path(graph *g,node *src, node *dest) {

 
  
  queue *breadthFirst = queue_empty(NULL);

  breadthFirst = queue_enqueue(breadthFirst,src);

  while (!queue_is_empty(breadthFirst))` {
    void *v = queue_front(breadthFirst);

    g = graph_node_set_seen(g,v,1);

    dlist *neighbours = graph_neighbours(g,v);
    dlist_pos pos = dlist_first(neighbours);

    while (!(dlist_is_end(neighbours,pos))) {
        void *n = dlist_inspect(neighbours,pos);
        if (graph_node_is_seen(g,n)) {

        }
        else {
        breadthFirst = queue_enqueue(breadthFirst,n);
        }
        pos = dlist_next(neighbours,pos);
    }

   breadthFirst = queue_dequeue(breadthFirst);
  }
}




struct queue {
    list *elements;
};

queue *queue_empty(free_function free_func)
{
    // Allocate the queue head.
    queue *q=calloc(1, sizeof(*q));
    // Create an empty list.
    q->elements=list_empty(free_func);

    return q;
}

queue *queue_enqueue(queue *q, void *v)
{
    list_insert(q->elements, v, list_end(q->elements));
    return q;
}

queue *queue_dequeue(queue *q)
{
    list_remove(q->elements, list_first(q->elements));
    return q;
}

void *queue_front(const queue *q)
{
    return list_inspect(q->elements, list_first(q->elements));
}

根据要求我添加了队列实现

尝试像这样修改您的 queue_empty 函数:

queue *queue_empty(free_function free_func)
{
    // Allocate the queue head.
    queue *q=calloc(1, sizeof(queue));
    // Create an empty list.
    q->elements=list_empty(free_func);

    return q;
}

解决了!谢谢提示,我提供的信息不足以让任何人真正帮助我。我做了一些调试,发现我基本上误解了我的实现。

*n 是结构中的一个值

我发送的*src,是一个有值和列表的节点

所以它在第一次迭代时工作正常,但随后我试图从 *n 中找到一个列表,它只是一个 void *value 而不是 struc 或列表。然后我的程序尝试首先使用该列表,这导致了分段错误。

修复方法是使用 n 值来使用我拥有的函数,以找到与该值对应的结构。