[英]How can i free the pointer i used? is it possible to free pointers after use?
[英]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个字节的内存并将指针保存到你的符号getid
( getid =(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.