C 结构节点下一个指针
我有一个结构,它包含一个指向同一类型结构的C 结构节点下一个指针,c,pointers,free,C,Pointers,Free,我有一个结构,它包含一个指向同一类型结构的next指针 我有下面的代码,它存储节点指针存储的结构的编号,释放它,并将节点设置为节点->下一个。如果在free之前调用了node->next如何知道它是什么 double data = node->element; free(node) node = node->next; return data; 但是,按照相同的逻辑,以下代码会出现故障。唯一的区别是,它使用一个节点,而另一个节点只将元素存储在其基本数据类型中 struct node
next
指针
我有下面的代码,它存储节点
指针存储的结构的编号,释放它,并将节点设置为节点->下一个
。如果在free
之前调用了node->next
如何知道它是什么
double data = node->element;
free(node)
node = node->next;
return data;
但是,按照相同的逻辑,以下代码会出现故障。唯一的区别是,它使用一个节点
,而另一个节点只将元素存储在其基本数据类型中
struct node *temp;
temp = node;
free(node);
node = node->next;
return temp;
为什么会这样?第一段代码是如何工作的
谢谢您不应该取消对已释放指针的引用-它会带来麻烦,很可能是您的错误根源。即使它没有故障,您也无法对该内存地址的数据的可用性做出任何假设,因此这不是一件好事。
您在问题中没有给出太多的细节,但为什么不稍微修改代码以尝试此顺序呢
struct node *temp = node->next;
free(node);
return temp;
这样,在删除节点之前存储指针
,不应得到segfault
至于第一个代码
double data = node->element;
free(node)
node = node->next;
return data;
为什么不干脆换成
double data = node->element;
free(node)
return data;
这将删除访问已释放内存的代码,并删除您的行
node = node->next;
在下一行中释放
节点时几乎毫无意义 是的,这是有道理的——但是为什么第一段代码可以工作呢?考虑Stutt持有<代码>双数据< /代码>和<代码>结构节点*NeX。它似乎起作用了。这是未定义的行为。它可能会因为任何原因随时停止工作。@Darksky一旦您释放内存,您可能仍然可以访问它,而您可能无法访问它。我想这取决于记忆在哪里。关键是,您不应该尝试使用它,因为该地址的任何数据都可能是毫无意义的-您不能依赖它。访问释放的内存不是一个好主意。见Mat的评论above@mathematician1975一旦您释放了节点
,结构节点*temp=node->next不应该不工作吗?我想我需要复制结构,所以temp不应该是指针。我是对的吗?我最终返回了指针,没有释放它,也没有要求其他类释放它。因此,返回一个分配的节点。