因此,作为练习,我正在开发一个使用递归函数的代码,以便制作一个简单的数学表达式计算器。问题是,当我运行它时,我遇到了分段错误 (6( 或 (11(,但我已经检查了一百次,每个函数调用似乎只从堆栈上它上方的函数中的变量访问内存,由指针 *init 提供。我哪里弄错了?
代码如下:
int solve(char *expression, int *init) {
int result;
int l = strlen(expression);
int i = *init;
//Inicializing result:
for (int n = 0; n <= l; n++) {
if ((expression[n]=='1')||(expression[n]=='2')||(expression[n]=='3')||(expression[n]=='4')||(expression[n]=='5')||
(expression[n]=='6')||(expression[n]=='7')||(expression[n]=='8')||(expression[n]=='9')) {
result = expression[n]-48;
break;
}
}
//Doing calculations:
int j = i;
for (j; j <= l; j++) {
if (expression[j] == '(') {
result = result + solve(expression, &j);
}
if (expression[j] == '+')
result = result + (expression[j+1]-48);
if (expression[j] == '-')
result = result - (expression[j+1]-48);
if (expression[j] == '*')
result = result * (expression[j+1]-48);
if (expression[j] == '/')
result = result / (expression[j+1]-48);
if (expression[j] == ')')
return result;
}
return result;
}
代码中有无限递归
int solve(char *expression, int *init) {
/* ... */
int j = i;
for (j; j <= l; j++) {
if (expression[j] == '(') {
result = result + solve(expression, &j);
/* ... */
如果它在 expression
中找到了一个'('
,那么该函数会使用相同的参数一遍又一遍地调用,直到程序堆栈被填满。然后你得到一个段错误。
使用循环或递归时,应始终确保构造最终终止,即它在每次迭代中明显更接近终止条件。在做像for(i=0;i<x;i++)
这样的简单循环时,看到是微不足道的,但是当迭代和终止条件分散在递归函数上时,这要困难得多。
这不是代码的唯一问题,但可以说是最严重的问题。