当我使用**(双指针)时如何使用免费?

时间:2017-06-09 15:24:29

标签: c pointers memory-management struct free

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**

我应该使用

free(list);

free(*list);

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

你可以告诉我这个吗?

2 个答案:

答案 0 :(得分:4)

您应该使用:

free(list);
  

但是当我写得像free(* list);时,我的X-code

上没有错误

这就是*list没有解除分配任何东西的原因,因为那里没有分配任何内容。但是,由于名为list的双指针所指向的内存未被释放,因此您的程序会因内存泄漏而受到影响。但是,如果没有看到你的程序崩溃,那你很幸运。

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

  

我应该立即编写malloc并写free()吗?不是在最后一行?

没有。首先使用malloc()动态分配内存,然后使用此内存(初始化,访问等),当您不再需要内存时,只有这样,才能使用free()取消分配内存。

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

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

顺序很重要,因为你不想有纠结的指针!

也许动态分配2D数组的example对此有更多解释,即使它与列表的数据结构不同。

PS:我们don't cast what malloc returns

答案 1 :(得分:3)

你应该免费释放malloc分配的任何内存......

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

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

list=(STUDENT**)malloc(num*sizeof(STUDENT*)); num指针的大小
为列表分配空间并将符号保存到符号list

我提醒分配的内存不必从操作系统初始化,所以我们应该初始化它。

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;
   }
}