我有一个结构,它包含一个指向同一类型结构的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;
而另一个只是将元素存储在其基本数据类型中。
{{1}}
为什么会这样?第一部分代码如何工作?
由于
答案 0 :(得分: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
。