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代码没有错误。
你可以告诉我这个吗?答案 0 :(得分:4)
您应该使用:
free(list);
但是当我写得像free(* list);时,我的X-code
上没有错误
这就是*list
没有解除分配任何东西的原因,因为那里没有分配任何内容。但是,由于名为list
的双指针所指向的内存未被释放,因此您的程序会因内存泄漏而受到影响。但是,如果没有看到你的程序崩溃,那你很幸运。
如果您使用Valgrind,则会看到内存泄漏。
我应该立即编写malloc并写free()吗?不是在最后一行?
没有。首先使用malloc()
动态分配内存,然后使用此内存(初始化,访问等),当您不再需要内存时,只有这样,才能使用free()
取消分配内存。
但是,如果您为list[i]
动态分配了空间,那么您应该这样做:
free(list[i]);
free(list);
顺序很重要,因为你不想有纠结的指针!
也许动态分配2D数组的example对此有更多解释,即使它与列表的数据结构不同。
答案 1 :(得分:3)
你应该免费释放malloc分配的任何内存......
如您所知,您请求了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;
}
}