繁体   English   中英

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

[英]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**

我应该喜欢用吗?

free(list);

要么

free(*list);

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

你能告诉我一下吗?

你应该使用:

free(list);

但是当我写得像free(* list);时,我的X代码没有错误

这就是为什么*list不会解除分配任何东西,因为那里没有分配任何内容。 但是,您的程序会遭遇内存泄漏,因为名为list的双指针指向的内存不是免费的。 但是,如果没有看到你的程序崩溃,那你很幸运。

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

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

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


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

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

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

也许我动态分配2D数组的例子会对此有更多解释,即使它是一个与列表不同的数据结构。


PS:我们不会抛出malloc返回的内容

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

如你getid ,你要求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;
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM