因此,作为练习,我正在开发一个使用递归函数的代码,以便创建一个简单的数学表达式计算器。问题是,当我运行它时,我得到了一个分段错误(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;
}
答案 0 :(得分:2)
代码中有无限递归
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++)
这样的简单循环时,看到它是微不足道的,但是当迭代和终止条件分散在递归函数上时会相当困难。
这不是您的代码唯一的问题,但可以说是最严重的问题。