使用**(双指针)时如何使用free?
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**
我应该使用 like
free(list);
或
free(*list);
我认为前者是对的,但是当我像后者那样写时,我的X代码没有错误。
你能告诉我吗?
你应该使用:
free(list);
but when I write like free(*list);, there's no error on my X-code
这就是 *list
不释放任何东西的原因,因为那里没有分配任何东西。但是,您的程序会以这种方式遭受内存泄漏,因为名为 list
的双指针指向的内存未释放。然而,你只是(不)幸运没有看到你的程序崩溃。
不过,如果您使用 Valgrind,您会看到内存泄漏。
Should I write malloc and write free() immediately? not in the end of the line?
没有。您首先使用 malloc()
动态分配内存,然后使用该内存(初始化、访问等),当您不再需要该内存时,然后才使用 free()
释放它。
但是,如果您为 list[i]
动态分配了 space,那么您应该这样做:
free(list[i]);
free(list);
顺序很重要,因为您不希望有纠结的指针!
也许我的 example 关于动态分配的二维数组对此有更多解释,即使它是与列表不同的数据结构。
PS: 我们don't cast what malloc returns.
您应该使用 free...释放 malloc 分配的所有内存...
如您所想,您请求了 8 个字节的内存并将指向它的指针保存到您的符号 getid
(getid =(char*)malloc(sizeof(char) * 8);
)
至于你的列表,这有点棘手:
您实际上分配了一个应该指向其他内存位置的指针列表(这些也可能是动态分配的)
list=(STUDENT**)malloc(num*sizeof(STUDENT*));
num
个指针的大小
为列表分配 space 并将指向它的指针保存在符号 list
.
我提醒一下,分配的内存不必从OS初始化,所以我们应该初始化它。
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;
}
}
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**
我应该使用 like
free(list);
或
free(*list);
我认为前者是对的,但是当我像后者那样写时,我的X代码没有错误。
你能告诉我吗?
你应该使用:
free(list);
but when I write like free(*list);, there's no error on my X-code
这就是 *list
不释放任何东西的原因,因为那里没有分配任何东西。但是,您的程序会以这种方式遭受内存泄漏,因为名为 list
的双指针指向的内存未释放。然而,你只是(不)幸运没有看到你的程序崩溃。
不过,如果您使用 Valgrind,您会看到内存泄漏。
Should I write malloc and write free() immediately? not in the end of the line?
没有。您首先使用 malloc()
动态分配内存,然后使用该内存(初始化、访问等),当您不再需要该内存时,然后才使用 free()
释放它。
但是,如果您为 list[i]
动态分配了 space,那么您应该这样做:
free(list[i]);
free(list);
顺序很重要,因为您不希望有纠结的指针!
也许我的 example 关于动态分配的二维数组对此有更多解释,即使它是与列表不同的数据结构。
PS: 我们don't cast what malloc returns.
您应该使用 free...释放 malloc 分配的所有内存...
如您所想,您请求了 8 个字节的内存并将指向它的指针保存到您的符号 getid
(getid =(char*)malloc(sizeof(char) * 8);
)
至于你的列表,这有点棘手:
您实际上分配了一个应该指向其他内存位置的指针列表(这些也可能是动态分配的)
list=(STUDENT**)malloc(num*sizeof(STUDENT*));
num
个指针的大小
为列表分配 space 并将指向它的指针保存在符号 list
.
我提醒一下,分配的内存不必从OS初始化,所以我们应该初始化它。
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;
}
}