在链表中使用 malloc 后的 Free()
Free() after using malloc in linked list
我知道每次我使用 malloc 或 calloc 我也必须释放内存,但在这种特定情况下我无法理解何时释放内存以及如何释放内存 generate()
功能代码不再有效。
void generate(int n){
node *tmp,*new;
int num,i;
head = malloc(sizeof(node));
if (head==NULL){
perror("malloc");
EXIT_FAILURE;
}
num = rand() % (42 - (-42) + 1) - 42;
head->data = num;
head->next = NULL;
tmp = head;
for(i=1;i<n;i++){
new = malloc(sizeof(node));
if(new == NULL){
perror("malloc");
EXIT_FAILURE;
}
num = rand() % (42 - (-42) + 1) - 42;
new->data = num;
new->next = NULL;
tmp->next = new;
tmp = tmp->next;
}
}
int main(){
int n;
do {
printf("give me the size of the linked list (less than 42):");
scanf("%d",&n);
if(n>42){
printf("i said less than 42. \n Please ");
}
} while(n>41);
srand(time(NULL));
generate(n);
printlist();
return 0;
}
如果您在 generate() 函数内部释放,当您的程序到达 printlist() 函数时,内存将被释放(因此您的程序将无法运行)。
您可以在 printlist() 后释放内存...
generate(n);
printlist();
/*
FREE MEMORY
*/
return 0;
但这没有意义,因为当您的程序以 return 0 结束时,操作系统会自动释放内存。
但是,如果您要在 printlist() 之后添加更多代码,您仍然应该释放内存。
链表删除使用单独的函数如下:
void deleteList()
{
node *tmp = head;
while(tmp != NULL)
{
tmp = tmp -> next;
free(head);
head = tmp;
}
head = tmp;
}
使用上述函数释放分配给链表的内存
generate(n);
printlist();
// FREE MEMORY
// function call
deleteList();
return 0;
我知道每次我使用 malloc 或 calloc 我也必须释放内存,但在这种特定情况下我无法理解何时释放内存以及如何释放内存 generate()
功能代码不再有效。
void generate(int n){
node *tmp,*new;
int num,i;
head = malloc(sizeof(node));
if (head==NULL){
perror("malloc");
EXIT_FAILURE;
}
num = rand() % (42 - (-42) + 1) - 42;
head->data = num;
head->next = NULL;
tmp = head;
for(i=1;i<n;i++){
new = malloc(sizeof(node));
if(new == NULL){
perror("malloc");
EXIT_FAILURE;
}
num = rand() % (42 - (-42) + 1) - 42;
new->data = num;
new->next = NULL;
tmp->next = new;
tmp = tmp->next;
}
}
int main(){
int n;
do {
printf("give me the size of the linked list (less than 42):");
scanf("%d",&n);
if(n>42){
printf("i said less than 42. \n Please ");
}
} while(n>41);
srand(time(NULL));
generate(n);
printlist();
return 0;
}
如果您在 generate() 函数内部释放,当您的程序到达 printlist() 函数时,内存将被释放(因此您的程序将无法运行)。
您可以在 printlist() 后释放内存...
generate(n);
printlist();
/*
FREE MEMORY
*/
return 0;
但这没有意义,因为当您的程序以 return 0 结束时,操作系统会自动释放内存。
但是,如果您要在 printlist() 之后添加更多代码,您仍然应该释放内存。
链表删除使用单独的函数如下:
void deleteList()
{
node *tmp = head;
while(tmp != NULL)
{
tmp = tmp -> next;
free(head);
head = tmp;
}
head = tmp;
}
使用上述函数释放分配给链表的内存
generate(n);
printlist();
// FREE MEMORY
// function call
deleteList();
return 0;