您尚未登录。

楼主 # 2023-10-25 16:07:03

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,378
积分: 1343.5

函数里将一个错误的指针,指向的变量,改变了,结果执行完该函数后,直接退出该函数的上一层函数了,没有执行接下来的语句。

这个函数的作用是,将表示四则运算的中缀表达式,变成后缀表达式。

void infixToPostfix(char* infix, char* postfix)
{
    Stack s;
    initStack(&s);

    char* p = infix;
    char* q = postfix;

    while(*p != '\0')
    {
        ...
    }
    while (!isEmpty(&s))
    {
       ...
    }
    *(q - 1) = '\0';
}

infix字符串数组,如果给正确的字符串表达式,则程序运行正常。
可有的时候,没有给infix字符串数组赋值,结果全是0x00,结果运行这个函数后,跟紧该函数的其他语句,都没有执行,直接跳出上一层函数了。

想了想,估计问题是出在函数结尾这个*(q-1) = '\0',本来q指向postfix数组的开头,结果,因为给的infix里没有找到字符串或运算符,直接执行这一句了,那么就是将postfi数组的上一个地址里的数据赋值为0x00了。

我好奇的是,为什么造成的结果是跳过接下来的语句,直接返回上一层的函数了呢?

离线

#1 2023-10-26 00:01:38

Fomalhaut
会员
注册时间: 2021-10-28
已发帖子: 36
积分: 31

Re: 函数里将一个错误的指针,指向的变量,改变了,结果执行完该函数后,直接退出该函数的上一层函数了,没有执行接下来的语句。

这种涉及未定义行为的代码,行为完全不可控。这个可能是破坏了堆栈里的返回地址。

离线

#2 2023-10-26 17:22:17

演技担当黄晓明
会员
注册时间: 2017-10-17
已发帖子: 184
积分: 122.5

Re: 函数里将一个错误的指针,指向的变量,改变了,结果执行完该函数后,直接退出该函数的上一层函数了,没有执行接下来的语句。

老哥你发现了异常回滚的逻辑了?恭喜了

Try
{
}
catch(Exception &ex)
{
}

离线

楼主 #3 2023-10-28 08:48:22

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,378
积分: 1343.5

Re: 函数里将一个错误的指针,指向的变量,改变了,结果执行完该函数后,直接退出该函数的上一层函数了,没有执行接下来的语句。

演技担当黄晓明 说:

老哥你发现了异常回滚的逻辑了?恭喜了

Try
{
}
catch(Exception &ex)
{
}

可是,c语言没有try catch啊。

离线

#4 2023-10-28 09:04:46

duanlin
会员
注册时间: 2023-10-09
已发帖子: 13
积分: 44

Re: 函数里将一个错误的指针,指向的变量,改变了,结果执行完该函数后,直接退出该函数的上一层函数了,没有执行接下来的语句。

曾经做过编译器,栈被破坏应该是很明显
猜测:栈变量q恰巧在栈里存返回地址的后面,q-1 正好是返回地址的低字节,被幅值为0,则很有可能会将原来的返回地址变小一点,则本次返回地址会变成更小一点地址的位置。

离线

#5 2024-04-22 17:10:59

feige
会员
注册时间: 2024-04-22
已发帖子: 2
积分: 12

Re: 函数里将一个错误的指针,指向的变量,改变了,结果执行完该函数后,直接退出该函数的上一层函数了,没有执行接下来的语句。

可以单步调试看看呀。另外,要考虑一下野指针的问题喔,infix为NULL的时候

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn