函数中结构体的生命周期

函数中结构体的生命周期

课程1-4中,函数void insert_student(linknode_t *head)的结构体s_t声明后,调用linklist.c的尾插法函数,将一条学生数据插入链表。


问:函数void insert_student(linknode_t *head),调用结束时,为什么该函数中的结构体s_t的内存没被释放?


相关代码:

student_manager.c

void insert_student(linknode_t *head)
{
    s_t  st = {0};
    linknode_t *p = NULL;
    bool is_id_exist = true;
    /*中间无关代码已省略*/
    if(is_id_exist == true)
    {
        insert_tail_linklist(head,st);
        printf("插入成功!\n");
    }
    return ;
}

linklist.c

void insert_tail_linklist(linknode_t *head,datatype_t data)
{
        //1.为新节点在堆区分配空间,用指针temp保存
        linknode_t *temp = NULL;
        temp = (linknode_t *)malloc(sizeof(linknode_t));
        //2.把data数据放到temp结点的数据域
        temp->data = data;

        //3.循环遍历找到尾结点
        linknode_t *p = head;

        while(p->next != NULL)
        {
                p = p->next;        
        }

        //4.在p后插入temp结点
        temp->next = p->next;
        p->next = temp;
        return ;
}


正在回答

登陆购买课程后可参与讨论,去登陆

2回答
第3行s_t st={0}中,st是栈上的变量,调用结束自动覆盖,肯定是释放了的。
  • 慕小白0101 提问者 #1

    我刚刚重新看了下insert_tail_linklist 函数, 形参居然是结构体datatype_t data。。。这代码太不规范了(虽然是约定熟成的,函数形参只接收值或者地址)。但这不是问题的重点,重点是大白老师的代码在下一次调用insert_tail_linklist ()的时候不是会把之前插入的数据清空掉吗(s_t 被释放了)。


    如果要问我为啥不把大白老师代码抄下来跑一遍再提问,我的回答是,学生管理系统我已经写完了,不过有几个方法实现的思路和老师不同,回头看视频是打算学习一下大白老师在开发过程的思路和设计

    2023-04-27 16:40:44
  • 慕小白0101 提问者 #2

    我懂了,原来如此,问题解决

     //2.把data数据放到temp结点的数据域
            temp->data = data;


    2023-04-27 16:45:17
  • 慕小白0101 提问者 #3
    /2.把data数据放到temp结点的数据域
            temp->data = data;


    不对啊,temp->data = data;这个代码的意思不是指把 形参data的地址拷贝到temp->data中吗

    2023-04-27 16:49:40
大白老师 2023-04-27 16:15:17
s_t的内存已经释放了,你看第三行代码s_t st定义的是局部变量的代码!函数传参数是把结构体中的数据拷贝了一份给data,原来的数据还在!insert函数结束后s_t的内存就没了
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师