栈数据结构实现中pop函数void**返回值的段错误问题
问题修复方案
核心错误分析
你的段错误根源在于指针传递逻辑错误,以及两处细节疏漏:
stack_pop函数中,直接给形参d赋值只会修改函数内部的局部指针副本,无法将弹出的数据地址传递回调用者;main中错误定义了void **d并传入NULL,导致函数内部无法向调用者返回数据;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
相关产品推荐
相关产品推荐

