c - 导致此函数中出现分段错误的原因



因此,作为练习,我正在开发一个使用递归函数的代码,以便制作一个简单的数学表达式计算器。问题是,当我运行它时,我遇到了分段错误 (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++)这样的简单循环时,看到是微不足道的,但是当迭代和终止条件分散在递归函数上时,这要困难得多。

这不是代码的唯一问题,但可以说是最严重的问题。

相关内容

  • 没有找到相关文章

最新更新