我有一个结构,它包含指向相同类型结构的next
指针。
我有以下代码,它存储node
指针存储的结构的编号,释放它,并将节点设置为node->next
。如果free
就在它之前被调用,那么node->next
是什么?
double data = node->element;
free(node)
node = node->next;
return data;
但是,遵循相同的逻辑,下面的代码segfault。唯一的区别是,它使用node
,而另一个只是将元素存储在其基本数据类型中。
struct node *temp;
temp = node;
free(node);
node = node->next;
return temp;
为什么会发生这种情况?那么第一段代码是如何工作的呢?
感谢
您不应该任何时候取消引用释放的指针-这会带来麻烦,很可能是您的segfault的来源。即使它没有分段,你也不能对该内存地址的数据的有效性做出任何假设,所以这不是一件好事。你还没有在你的问题中给出太多细节,但为什么不稍微修改一下你的代码来尝试这个订单呢
struct node *temp = node->next;
free(node);
return temp;
通过这种方式,您可以在删除node
之前存储指针,并且不应该获得segfault
关于第一个代码
double data = node->element;
free(node)
node = node->next;
return data;
为什么不直接用取代呢
double data = node->element;
free(node)
return data;
因为这会删除访问释放内存的代码,以及您的线路
node = node->next;
当您在下一行中释放node
时,这实际上毫无意义。