首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于链表free的有关问题,感兴趣的过来看看

2012-10-21 
关于链表free的问题,感兴趣的过来看看!代码相当简单,创建一个链表,再free,但是free后发现一个问题,当我再

关于链表free的问题,感兴趣的过来看看!
代码相当简单,创建一个链表,再free,但是free后发现一个问题,当我再打印这个链表时,会发现
链表头不为NULL,而且出现了内存的非法访问,输出任意值。

难道说,我释放完链表的内存空间后,那片内存就填充了另外的值??

C/C++ code
 #include <stdio.h>#include <stdlib.h>#include <string.h>#include <windows.h>typedef struct Student{    int num;    int age;    struct Student *next;}STU;STU *creat(int n);void printf_all(STU *pb);void link_free(STU *head);int main(){    STU *head=NULL;    int n;    printf("input num  you want creat node\n");    scanf("%d",&n);    head=creat(n);                    //创建n个结点    printf_all(head);    printf("we will free link\n");    link_free(head);    Sleep(100);        if(head==NULL)  //困惑? head!=NULL?    {        printf("***********\n");    }    printf_all(head); //有错误,并有打印,为任意值    return 0;}STU *creat(int n){    STU *head,*pf,*pb;                     int i;    for (i=0;i<n;i++)    {        pb=(STU *)malloc(sizeof(STU));        printf("input num age \n");        scanf("%d%d",&pb->num,&pb->age);        if (i==0)        {            head=pf=pb;                  //当是头时,让指针均指向头        }        else        {            pf->next=pb;              //后面结点时,让前向指针的next指向当前结点,再把前向指针后移一下            pf=pb;        }    }    pb->next=NULL;    return head;}void printf_all(STU *pb){    STU *head=pb;    while (head!=NULL)    {        printf("num=%d  age=%d\n",head->num,head->age);        head=head->next;    }    if(pb==NULL)    {        printf("the list is null.\n");    }}/*---------------------------------------------------链表释放---------------------------------------------------*/void link_free(STU *head){    STU *pb;    pb=head;    while(head!=NULL)    {        pb=head;        head=head->next;        free(pb);    }    if(head==NULL)    {        head = NULL;       //加上这句,发现也没用,是不是应该需要返回        printf("comein\n"); //有打印    }}


[解决办法]
本来就是这样 你都free掉了 判断NULL有什么用? 只能瞎指
[解决办法]
STU link_free(STU *&head)
这样改就行了
[解决办法]
探讨

引用:
好像明白LZ的疑问是什么了。

LZ忘了个基本的知识点:C函数的参数为值传。

虽然link_free中的形参head值变为NULL了,但它并不影响main里的实参head。main里的变量head仍指向原来的地址(虽然已经被释放)。

至于之后调用printf_all函数时head指向地址的内容有没有改变要看head释放到再次使用它之间有没有别的进程申请……

热点排行