这是怎么引起段错误的(短代码)(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 值来使用我拥有的函数,以找到与该值对应的结构。
这导致了我的分段错误,每当我注释掉 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 值来使用我拥有的函数,以找到与该值对应的结构。