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()约(char *getid)
我知道我应该写
free(getid);
那我怎么才能用免费的
STUDENT ** list = NULL ; // **It's about struct**
我应该用像
free(list);
或
free(*list);
我认为前者是正确的,但是当我像后者一样编写时,我的X代码没有错误。
你能告诉我这件事吗?
发布于 2017-06-09 15:35:27
你应该使用:
free(list);
但是,当我像空闲(*list)那样写时,我的X代码没有错误。
这就是为什么*list
不释放任何东西的原因,因为那里没有分配任何东西。然而,由于名为list
的双指针所指向的内存不是空闲的,所以您的程序遭受了内存泄漏的困扰。然而,您只是(不)幸运地没有看到程序崩溃。
但是,如果使用瓦兰,就会看到内存泄漏。
我应该立即写malloc并写入free()吗?不是在队伍的尽头?
不是的。首先使用malloc()
动态分配内存,然后使用此内存(初始化、访问等)。当您不再需要内存时,只有这样,您才会使用free()
来释放它。
但是,如果您为list[i]
动态分配了空间,那么您应该这样做:
free(list[i]);
free(list);
在顺序重要的地方,因为您不想有纠缠指针!
也许我在动态分配2D数组上的示例会对此做更多的解释,尽管它是一个与列表不同的数据结构。
PS:我们不要抛出malloc返回的内容。
发布于 2017-06-09 15:36:09
你应该释放任何由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;
}
}
https://stackoverflow.com/questions/44461526
复制相似问题