0

我有一个结构,它包含一个next指向相同类型结构的指针。

我有以下代码存储node指针存储的结构的编号,释放它,并将节点设置为node->next. 如果在它之前被调用,怎么node->next知道它是什么?free

double data = node->element;
free(node)
node = node->next;
return data;

但是,遵循相同的逻辑,以下代码会出现段错误。唯一的区别是它使用了一个node,而另一个只是将元素存储在它的基本数据类型中。

struct node *temp;
temp = node;
free(node);
node = node->next;
return temp;

为什么会这样?第一段代码是如何工作的?

谢谢

4

1 回答 1

2

永远不应该取消引用一个释放的指针——它是在自找麻烦,很可能是你的段错误的根源。即使它没有段错误,您也无法对该内存地址处数据的有效性做出任何假设,因此这不是一件好事。你没有在你的问题中提供太多细节,但为什么不稍微修改你的代码来尝试这个顺序

struct node *temp = node->next;
free(node);
return temp;

这样你在删除之前存储指针node并且不应该得到段错误

至于第一个代码

double data = node->element;
free(node)
node = node->next;
return data;

为什么不直接替换为

double data = node->element;
free(node)
return data;

因为这会删除访问已释放内存的代码,以及您的行

node = node->next;

node无论如何, 当您在下一行免费时,这实际上是毫无意义的。

于 2012-07-08T10:47:22.757 回答