Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 结构节点下一个指针_C_Pointers_Free - Fatal编程技术网

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不应该是指针。我是对的吗?我最终返回了指针,没有释放它,也没有要求其他类释放它。因此,返回一个分配的节点。