关于C';stdlib.h #包括 结构strt; 类型定义结构{ int i; 结构strt*next; }strt; strt*s1=malloc(sizeof(strt)); strt*s2=s1->next=malloc(sizeof(strt)); 免费(s1);

关于C';stdlib.h #包括 结构strt; 类型定义结构{ int i; 结构strt*next; }strt; strt*s1=malloc(sizeof(strt)); strt*s2=s1->next=malloc(sizeof(strt)); 免费(s1);,c,C,现在,free(s1)是仅释放s1指向的块,还是释放s1和s1->next/s2指向的块 我知道这一定是一个被问了一千遍的问题,但我 无法在搜索引擎中描述这一点,也无法 我发现在free()函数的文档中直接提到了相同的问题。您将出现内存泄漏。只有s1指向的内存被释放,而不是s2和s1->next指向的内存。所以你需要 #include <stdlib.h> struct strt; typedef struct { int i; struct strt *next;

现在,
free(s1)
是仅释放s1指向的块,还是释放s1s1->next/s2指向的块

我知道这一定是一个被问了一千遍的问题,但我 无法在搜索引擎中描述这一点,也无法
我发现在
free()
函数的文档中直接提到了相同的问题。

您将出现内存泄漏。只有
s1
指向的内存被释放,而不是
s2
s1->next
指向的内存。所以你需要

#include <stdlib.h>

struct strt;
typedef struct {
    int i;
    struct strt *next;
} strt;

strt *s1 = malloc(sizeof(strt));
strt *s2=s1->next = malloc(sizeof(strt));

free(s1);

一个好的经验法则是为每个
malloc
都提供一个
free
,这样会导致内存泄漏。只有
s1
指向的内存被释放,而不是
s2
s1->next
指向的内存。所以你需要

#include <stdlib.h>

struct strt;
typedef struct {
    int i;
    struct strt *next;
} strt;

strt *s1 = malloc(sizeof(strt));
strt *s2=s1->next = malloc(sizeof(strt));

free(s1);

一个好的经验法则是为每个
malloc

都有一个
free
free
函数不知道释放的内存块背后的结构。调用
free
仅释放作为其参数传递的指针指向的块。在您的情况下,您需要首先释放
s1->next
,然后释放
s1
本身:

free(s1);
free(s2);

free
函数不知道释放的内存块背后的结构。调用
free
仅释放作为其参数传递的指针指向的块。在您的情况下,您需要首先释放
s1->next
,然后释放
s1
本身:

free(s1);
free(s2);

根据
malloc
,您应该有一个
free
。因此,您必须分别释放
s1
s2
。要么:

free(s1->next);
free(s1);
或:

在第二种情况下,语句的顺序很重要,因为如果释放了
s1
,则无法访问
s1
引用的对象

C11(n1570),§7.22.3.3
免费
功能

free
功能使
ptr
指向的空间被释放,即可供进一步分配


根据
malloc
,您应该有一个
free
。因此,您必须分别释放
s1
s2
。要么:

free(s1->next);
free(s1);
或:

在第二种情况下,语句的顺序很重要,因为如果释放了
s1
,则无法访问
s1
引用的对象

C11(n1570),§7.22.3.3
免费
功能

free
功能使
ptr
指向的空间被释放,即可供进一步分配


内存泄漏,即丢失了指向先前由
malloc
分配的某个内存的指针,并且不再有该指针可传递到
free


您应该从这种性质的结构中以与
malloc
相反的顺序调用
free

您存在内存泄漏,即您丢失了指向先前由
malloc
分配的某个内存的指针,并且不再有该指针传递到
free


你应该从这种性质的结构中调用
free
,调用顺序与
mallocs
相反。

究竟
free()
如何知道你的结构的内部结构?它只知道它是一个
void*
…究竟
free()
如何知道结构的内部结构?它只知道这是一个
void*
…+1,引用标准并用逻辑解释的完美答案。+1,引用标准并用逻辑解释的完美答案。