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()函数再次检索分配的内存。

这就是我想问你的。

我了解到,如果我想对(char * getid)使用free()

我知道我应该写
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数组上的example对此更具解释性,即使它的数据结构与列表不同。

PS:我们don't cast what malloc returns

10-08 08:21