这个函数的作用是,将表示四则运算的中缀表达式,变成后缀表达式。
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了。
我好奇的是,为什么造成的结果是跳过接下来的语句,直接返回上一层的函数了呢?
离线
这种涉及未定义行为的代码,行为完全不可控。这个可能是破坏了堆栈里的返回地址。
离线
老哥你发现了异常回滚的逻辑了?恭喜了
Try
{
}
catch(Exception &ex)
{
}
离线
老哥你发现了异常回滚的逻辑了?恭喜了
Try
{
}
catch(Exception &ex)
{
}
可是,c语言没有try catch啊。
离线
曾经做过编译器,栈被破坏应该是很明显
猜测:栈变量q恰巧在栈里存返回地址的后面,q-1 正好是返回地址的低字节,被幅值为0,则很有可能会将原来的返回地址变小一点,则本次返回地址会变成更小一点地址的位置。
离线
可以单步调试看看呀。另外,要考虑一下野指针的问题喔,infix为NULL的时候
离线