使用**(双指针)时如何使用free?

How can I use free when I used ** ( double pointer )?

STUDENT ** list=NULL;
char *getid;
getid =(char*)malloc(sizeof(char) * 8);
printf("How many student? ");
int menuNum,num=0;

scanf("%d",&num);
list=(STUDENT**)malloc(num*sizeof(STUDENT*));

我是这样用指针的。 正如我从教授那里了解到的,在完成我的代码之前,我应该使用 free() 函数再次检索分配的内存。

这是我想问你的。

我了解到如果我想使用 free() about (char *getid)

我知道我应该写

free(getid);

那我怎么免费使用呢

STUDENT ** list = NULL ; // **It's about struct**

我应该使用 like

free(list);

free(*list);

我认为前者是对的,但是当我像后者那样写时,我的X代码没有错误。

你能告诉我吗?

你应该使用:

free(list);

but when I write like free(*list);, there's no error on my X-code

这就是 *list 不释放任何东西的原因,因为那里没有分配任何东西。但是,您的程序会以这种方式遭受内存泄漏,因为名为 list 的双指针指向的内存未释放。然而,你只是(不)幸运没有看到你的程序崩溃。

不过,如果您使用 Valgrind,您会看到内存泄漏。

Should I write malloc and write free() immediately? not in the end of the line?

没有。您首先使用 malloc() 动态分配内存,然后使用该内存(初始化、访问等),当您不再需要该内存时,然后才使用 free() 释放它。


但是,如果您为 list[i] 动态分配了 space,那么您应该这样做:

free(list[i]);
free(list);

顺序很重要,因为您不希望有纠结的指针!

也许我的 example 关于动态分配的二维数组对此有更多解释,即使它是与列表不同的数据结构。


PS: 我们don't cast what malloc returns.

您应该使用 free...释放 malloc 分配的所有内存...

如您所想,您请求了 8 个字节的内存并将指向它的指针保存到您的符号 getid (getid =(char*)malloc(sizeof(char) * 8);)

至于你的列表,这有点棘手:
您实际上分配了一个应该指向其他内存位置的指针列表(这些也可能是动态分配的)

list=(STUDENT**)malloc(num*sizeof(STUDENT*)); num 个指针的大小
为列表分配 space 并将指向它的指针保存在符号 list.

我提醒一下,分配的内存不必从OS初始化,所以我们应该初始化它。

for(int i=0; i<num; i++)
{
   list[i] = NULL;
}       

您也可以使用 memset(list, NULL, num * sizeof(STUDENT*)).

您说得非常正确,您应该通过 free(list)
释放内存 但是在释放指针列表本身之前,您应该释放列表中的项目。 (同样,如果项目是动态分配的!)

for(int i=0; i<num; i++)
{
   if(list[i] != NULL) // only if allocated.
   {
      free(list[i]); // free the element @ position i
      list[i] = NULL;
   }
}