You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

栈数据结构实现中pop函数void**返回值的段错误问题

问题修复方案

核心错误分析

你的段错误根源在于指针传递逻辑错误,以及两处细节疏漏:

  1. stack_pop函数中,直接给形参d赋值只会修改函数内部的局部指针副本,无法将弹出的数据地址传递回调用者;
  2. main中错误定义了void **d并传入NULL,导致函数内部无法向调用者返回数据;
  3. stack_push的switch分支未加break,会导致类型标识i被错误覆盖。

分步修复

1. 修复main函数的弹出逻辑

将接收数据的变量改为void*类型,并传入它的地址给stack_pop,确保函数能修改调用者的变量:

case 2:
    void *d = NULL; 
    my_stack = stack_pop(my_stack, &d); 
    if (d != NULL) { // 先判断是否成功弹出元素
        container *cont = (container*)d; 
        printf("%d", cont->i);
        // 必须手动释放container及其内部的value,避免内存泄漏
        free(cont->value);
        free(cont);
    }
    break;

2. 修复stack_pop的参数赋值逻辑

通过*d修改调用者传入的指针的值,而非修改形参本身:

stack stack_pop(stack s, void **d){
    if(s.base == NULL && s.top == NULL){
        puts("Stack is empty: cannot execute pop.");
        if (d != NULL) { // 给调用者返回NULL标识失败
            *d = NULL;
        }
    } else {
        node *my_node_1 = s.top;
        node *my_node_2 = my_node_1;
        my_node_1 = my_node_1->below;
        
        if (d != NULL) {
            *d = my_node_2->data; // 将弹出的container地址写入调用者的指针
        }
        
        free(my_node_2); // 仅释放节点本身,data交给调用者处理
        
        s.top = my_node_1;
        if(my_node_1==NULL) s.base = NULL;
    }
    return s;
}

3. 修复stack_push的switch分支

给每个case添加break,避免类型标识被错误覆盖:

switch(chose_push){
    case 1:
        ...
        my_container->i = 1;
        my_container->value = push_int; 
        break;
    case 2:
        ...
        my_container->i = 2;
        my_container->value = push_float;
        break;
    case 3:
        ...
        my_container->i = 3;
        my_container->value = push_char;
        break;
    case 4:
        ...
        my_container->i = 4;
        my_container->value = push_char_arr;     
        break;
}

额外注意事项

  • 调用stack_pop后,必须手动释放container及其内部的value,否则会造成内存泄漏;
  • stack_pop中保留对d == NULL的判断,可避免空指针访问。

内容的提问来源于stack exchange,提问作者Alessandro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 10:45:19