首页 新闻 会员 周边 捐助

关于函数return时发生数据丢失,具体细节的疑问。

0
悬赏园豆:100 [已解决问题] 解决于 2024-03-17 18:55

在学习数据结构,尝试使用堆栈方法计算字符串常量算式8+8*8+8
使用单链表方法
在断点找错后发现具体错误发生在此处

单次运算(&栈,i);//调用

int 单次运算X(struct 算栈* 值, int data) {
int i, i1, i2;
if (弹栈(&值, &i1) * 弹栈(&值, &i2) == 0)return 0;

switch ((char)data)
{
case'+':i = i1 + i2; break;
case'-':i = i1 - i2; break;
case'*':i = i1 * i2; break;
case'/':i = i1 / i2; break;
default:return 0;
}

压栈(&值, i);//这里的压栈过程成功了
return 1;//断点到此处时一切正常
    //但是return函数结束后[值]这个栈的地址被改了,导致我接下来的操作栈错误
    //问题,这里发生了什么,为什么栈的地址被改变了
    //猜测,[值]的地址被改为'1'的字符常量,因为其栈数据和下一节点无法读取
    }

问题我已经自行解决,方法如下

值=单次运算(&值,i);//通过return保证最终地址一定会传回
struct 算栈* 单次运算(struct 算栈* 值, int data) {
int i,i1,i2;
if (弹栈(&值, &i1) * 弹栈(&值, &i2)==0)return 0;

switch ((char)data)
{
case'+':i = i1 + i2; break;
case'-':i = i1 - i2; break;
case'*':i = i1 * i2; break;
case'/':i = i1 / i2; break;
default:return 0;
}

压栈(&值, i);
return 值;
}

栈模型

struct 算栈 {
int i;
struct 算栈* last;
};

这里是我在尝试使用C语言编写,示例是C++,我把传入参数的引用改成了二级指针
使用int是在模仿C++的bool类型,在多次改错和调试后找到的问题所在
代码完整部分过长,想看可以再评论说明,我会发在评论

问题如上,为什么return操作改变了我传入的一级指针参数

随缘XD的主页 随缘XD | 菜鸟二级 | 园豆:336
提问于:2024-03-02 19:22
< >
分享
最佳答案
1

这个问题啊,其实挺有意思的。就是在搞栈操作时遇到了点小插曲,本来嘛,你想在函数里改变指针的指向,就得给它传一个指针的指针,也就是说,得传入二级指针对吧。看来你已经发现了这个点,用二级指针搞定了它。

那个原始的 单次运算 函数里,你传进去的是 struct 算栈* 的地址,也就变成了 struct 算栈**,在函数里你如果写了像 值 = 新地址 这样的代码,那肯定是在函数里改了指针的指向啦。但这事儿啊,只在函数里有效,一旦出了函数的大门,外面的那个指针可是一点儿都不知道里面发生了什么。

要是你想让这个改变也影响到函数外面,就得在调用函数的时候用 &栈 这样子,然后在函数里用 *值 = 新地址 来搞定,这样出来后,外面的 栈 就会指向新的地址了。

修正后的代码里,你是通过返回新的栈地址,然后在函数外面再把它赋给 值,这招挺机智的,确保了一切都按你的预期走。

至于那个 “return 操作改变了我传入的一级指针参数” 的问题,其实啊,return 它自己是不会去改变啥的,它只是负责返回值。如果你发现指针变了,那改变肯定是在你函数里对指针做的手脚。

所以呢,你现在这样,通过返回新的指针,然后在外头更新它,这操作没毛病,挺适合管理栈这种动态的数据结构。

收获园豆:100
AI视界 | 菜鸟二级 |园豆:318 | 2024-03-10 17:34

谢谢我想明白了,是我的栈模型的问题,
传入的是栈顶指针,所以函数内在栈操作时改变了栈顶,函数外部不知道我改变了栈顶,所以原栈顶指向位置已经不存在了,从而丢失栈的地址
因为我在尝试使用c语言编写,所以手动把&引用改写成了二级指针,是我考虑不周

随缘XD | 园豆:336 (菜鸟二级) | 2024-03-17 18:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册