因为子函数内接收的结构体指针“H”,其开辟内存在子函数的堆中,而主函数中链表H空间在主函数中的堆空间,无法修改到实参所存储的值(H->data:用户输入数值,H->next下一节点地址)。所以传参二级结构体指针,通过解引用找到节点结构体指针,操作实参空间和值。
错误写法:
使用一级指针做参数,无法修改主函数里的实参H所存储的值,只能释放H所在空间,之后节点指针变成野指针。
头文件和调用函数文件:
实现函数文件:
运行结果,通过p = H, H = H->next逐次将链表各个节点内存都free了。
但由于p和H是两个不同的指针,p = NULL,而H所存储的的地址值仍未改动,还是存储的原先地址,而由于H空间被释放,所以链表上每个节点的指针都变成了野指针,所以遍历链表会出现段错误。
正确写法
二级指针linklist *h传参,子函数用一级指针lingklist p操作*h,*h即主函数一级指针H
linklist H 即node * H,一级指针
linklist * h 即 node **h,二级指针
记得二级指针在主函数中创建内存
头文件和调用函数文件:
实现函数文件:
运行结果,解引用二级指针*h 即一级指针H;p遍历链表各个节点。通过free(*h)释放了主函数中单链表单个节点的堆空间,然后*h =NULL将原先H存储地址赋值为NULL,杜绝了野指针。逐次循环,把链表节点空间依次释放,并将所有节点指针置NULL。遍历链表发现节点指针为NULL,弹出提示结束。