使用for循环在C中使用free()

使用for循环在C中使用free(),c,memory,free,C,Memory,Free,我正在用C为我的班级写一个程序,我正在做结对编程。我想知道它怎么没有破坏程序。我的合作伙伴在下面添加了这段代码,我运行valgrind进行测试,看看是否有内存泄漏,这似乎很好——然后,我还是个新手。无论如何,我想知道这段代码是如何工作的,因为当我释放curr时,下一个运行的东西是curr=curr->link-但是我们刚刚释放了curr!那么,如果curr被从内存中取出,它怎么可能有一个链接呢?我以为这样的事情是行不通的 下面是我的搭档写的: for(node curr = list->h

我正在用C为我的班级写一个程序,我正在做结对编程。我想知道它怎么没有破坏程序。我的合作伙伴在下面添加了这段代码,我运行valgrind进行测试,看看是否有内存泄漏,这似乎很好——然后,我还是个新手。无论如何,我想知道这段代码是如何工作的,因为当我释放curr时,下一个运行的东西是curr=curr->link-但是我们刚刚释放了curr!那么,如果curr被从内存中取出,它怎么可能有一个链接呢?我以为这样的事情是行不通的

下面是我的搭档写的:

for(node curr = list->head; curr != NULL; curr = curr->link ){
   if (!dflag) printf("%s\n",curr->words);
   else printf("[%p]\n",curr);
   free(curr->words);
   free(curr);
}
下面是我在^this^崩溃的情况下想做的事情:

for (node curr = list->head; curr != NULL; ) {
   if (!dflag) printf("%s\n",curr->words);
   else printf("[%p]\n",curr);
   node prev = curr;
   curr = curr->link;
   free(prev);
}
此外,以下是我们创建节点的方式:

typedef struct node *node;

struct node {
   cstring words;
   node link;
};

仅仅因为你已经释放了内存并不意味着它的内容已经丢失。您的内容可能会在那里保留一段时间,直到内存返回给
malloc()
的另一个调用者并被调用者写入

显然,你不能也不应该依赖于此
valgrind
应该有与访问释放内存相关的打印错误


这是我们的老朋友“未定义行为”的一个例子。虽然我们可以解释为什么它可能会以某种方式运行,但不能保证会发生这种情况,而且依赖它从定义上讲是错误的。因此,当这些东西崩溃时,您实际上更幸运,因为很可能这些东西在您最不经意的时候被忽略并导致各种奇怪的问题。

您需要使用
-g
标志进行编译,以获得有用的valgrind输出。第一个代码是错误的,因为您无法对释放的数据进行任何假设。定义自指针的一般方法如下:

struct node {
   cstring words;
   struct node *link;
};

这是一个非常糟糕的想法:
typedef结构节点*node。现在
struct node
node
都是名称类型,但它们的名称不同。伊加兹!未定义的行为不保证崩溃。访问解除分配的指针会导致未定义的行为。问题很可能隐藏在
typedef struct node*node
中。第一个代码段显然是错误的,因为它在
free(curr)
之后取消了对
curr
的引用。在释放内存时,“free”函数不会重置指针。释放内存后,我们必须显式地将指针初始化为NULL。提醒他在
free()之后内容可能会保留有什么意义?他应该在
free()
@phoeagon之前取消引用它。它解释了观察到的行为。答案没有提到未定义的行为。应该这样。