首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我使用** (双指针)时,如何使用空闲?

当我使用** (双指针)时,如何使用空闲?
EN

Stack Overflow用户
提问于 2017-06-09 15:24:28
回答 2查看 3K关注 0票数 3
代码语言:javascript
运行
复制
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)

我知道我应该写

代码语言:javascript
运行
复制
free(getid);

那我怎么才能用免费的

代码语言:javascript
运行
复制
STUDENT ** list = NULL ; // **It's about struct**

我应该用像

代码语言:javascript
运行
复制
free(list);

代码语言:javascript
运行
复制
free(*list);

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

你能告诉我这件事吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-09 15:35:27

你应该使用:

代码语言:javascript
运行
复制
free(list);

但是,当我像空闲(*list)那样写时,我的X代码没有错误。

这就是为什么*list不释放任何东西的原因,因为那里没有分配任何东西。然而,由于名为list的双指针所指向的内存不是空闲的,所以您的程序遭受了内存泄漏的困扰。然而,您只是(不)幸运地没有看到程序崩溃。

但是,如果使用瓦兰,就会看到内存泄漏。

我应该立即写malloc并写入free()吗?不是在队伍的尽头?

不是的。首先使用malloc()动态分配内存,然后使用此内存(初始化、访问等)。当您不再需要内存时,只有这样,您才会使用free()来释放它。

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

代码语言:javascript
运行
复制
free(list[i]);
free(list);

在顺序重要的地方,因为您不想有纠缠指针!

也许我在动态分配2D数组上的示例会对此做更多的解释,尽管它是一个与列表不同的数据结构。

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

票数 4
EN

Stack Overflow用户

发布于 2017-06-09 15:36:09

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

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

至于你的清单,这是一个比较棘手的问题:

您实际上分配了一个指针列表,这些指针应该指向其他内存位置(这些也可能是动态分配的)。

list=(STUDENT**)malloc(num*sizeof(STUDENT*));指针的num大小

为列表分配空间,并将指向它的指针保存在符号list处。

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

代码语言:javascript
运行
复制
for(int i=0; i<num; i++)
{
   list[i] = NULL;
}       

您也可以使用memset(list, NULL, num * sizeof(STUDENT*))

你是非常正确的,你应该通过free(list)来释放它的记忆,

但是,在释放指针列表本身之前,应该先释放列表中的项。(同样,如果这些项是动态分配的!)

代码语言:javascript
运行
复制
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;
   }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44461526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档