什么导致此功能中的分段错误?

时间:2017-11-16 15:06:42

标签: c pointers segmentation-fault

因此,作为练习,我正在开发一个使用递归函数的代码,以便创建一个简单的数学表达式计算器。问题是,当我运行它时,我得到了一个分段错误(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;
}

1 个答案:

答案 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++)这样的简单循环时,看到它是微不足道的,但是当迭代和终止条件分散在递归函数上时会相当困难。

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