C 如何释放携带指向某个位置的指针的节点的内存

C 如何释放携带指向某个位置的指针的节点的内存,c,linked-list,C,Linked List,我有一个链接列表,其节点结构如下所示 struct node { char *p; struct node *next; }*start; 现在我们char*p是指向由malloc调用分配的内存位置的指针。同样,整个内存位置也是使用malloc分配的。现在想释放malloc调用占用的空间,如下所示 main() { struct node *tmp; tmp=malloc(sizeof(struct node)); tmp->next=NULL

我有一个链接列表,其节点结构如下所示

  struct node
  {
  char *p;
  struct node *next;
  }*start;
现在我们char*p是指向由malloc调用分配的内存位置的指针。同样,整个内存位置也是使用malloc分配的。现在想释放malloc调用占用的空间,如下所示

  main()
 {
   struct node *tmp;
   tmp=malloc(sizeof(struct node));
   tmp->next=NULL;
   tmp->p=malloc(2*sizeof(int));

   free(tmp->p);
   free(tmp);

 }

这是释放内存的正确方法还是这里需要一些东西?

这是正确的方法,但不要忘记在使用free后将指针指定为NULL,否则指针将成为悬空指针

像这样使用它们-

自由(tmp->p);
tmp->p=NULL

您正在正确释放,尽管通常您会有一个指向第一个节点的指针,然后通过跟随这些指针在列表中循环。e、 g

struct node *first;
... list created, first pointing to first in list, where last next is == NULL ...

while (first != NULL) 
{
  struct node* next = first->next;
  free( first->p );
  free( first );
  first = next;
}

顺便问一下,为什么您将
p
声明为
char*
但分配整数?输入错误?

是的,关于tmp->p-NULL点绝对没有问题,但我想知道如果我们不使用tmp->p=NULL语句,是否会出现分段错误?不,在这种情况下,不会出现分段错误,因为您没有取消对悬空指针的引用。仅仅是代码中存在悬空指针不会导致SEGFULT。Segfault发生在由于诚实的错误而试图使用悬空指针时。如果在释放节点内的指针p后尝试解除其引用,则可能会发生SEGFULT。类似这样的结果将导致segfault->free(tmp->p)*(tmp->p);//segfault。我试图打印此station*(tmp->p),但仍然没有出现分段错误。实际上,一旦释放内存,就不应该使用它,否则会导致未定义的行为,但这并不意味着你不能使用它。这里发生的是内存被释放了,但是它仍然没有被再次分配,所以你没有得到任何SEGFULTS。你看到改进的要点了吗,释放内存后将指针分配给NULL?你不觉得他说的这一点很重要吗