如何解决在链接列表中使用malloc之后的Free
我知道每次我使用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;
}
解决方法
使用单独的功能删除链表,如下所示:
$(Build.BuildNumber)
使用上述功能释放分配给链表的内存
void deleteList()
{
node *tmp = head;
while(tmp != NULL)
{
tmp = tmp -> next;
free(head);
head = tmp;
}
head = tmp;
}
,
如果您在generate()函数中释放了内存,则当程序进入printlist()函数时,内存将被释放(因此程序将无法运行)。
您可以在printlist()之后释放内存。
generate(n);
printlist();
/*
FREE MEMORY
*/
return 0;
但是没有意义,因为当程序以return 0结尾时,操作系统将自动释放内存。
但是,如果要在printlist()之后添加更多代码,则仍应释放内存。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。