递归函数调用期间的C运行时错误

时间:2017-11-05 12:34:23

标签: c recursion segmentation-fault runtime-error

所以我有一个程序来查找整数N可以表示为" n"的总和的方式。整数。 例如,10可以表示为2,3和5的组合,如下所述 -

10 = 5 + 5

10 = 5 + 3 + 2

10 = 3 + 3 + 2 + 2

10 = 2 + 2 + 2 + 2 + 2

#include<stdio.h>
#include<stdlib.h>
int ways(int,int*,int);


int main()    {
    int n,num; //n is number of possible integers 
    scanf("%d",&n);
    int*curr=(int*)malloc(n*sizeof(int));     //dynamically allocated array that stores all "n" integers in array form
    for(int i=0;i<n;i++)    {
        scanf("%d",curr+i); 
    }
    int t,N; //t is number of test cases
    scanf("%d",&t);
    while(t--)    {
        scanf("%d",&N);     //for each test case, scans the number N that needs to be expressed as a sum of combinations those "n" integers
        num=ways(N,curr,n);
        printf("%d\n",num);
    }
    return 0;
}

int ways(int N,int*p,int size) {
    int flag=1;
    for(int i=0;i<size;i++) {
        if(N/(*(p+i))!=0)  {
            flag=0;
            break;
        }
//Above loop says that if number N is less than all of the "n" integers, it 
cannot be expressed as their sum. Hence, 0 will be returned if flag is 1
    }
    if(flag==1)
        return 0;
    if(N==0)
        return 1;
    int num=0,temp;
    for(int i=0;i<size;i++) {
        temp=*(p+i);
        num=num+ways(N-temp,p,size);  //GETTING RUNTIME ERROR AT THIS LINE
    }   
    return num;
}

该程序在递归函数调用时出现SIGSEGV错误,即使递归深度非常小

2 个答案:

答案 0 :(得分:2)

i的第一个ways循环中,您似乎正在寻找一个值 数组p小于N(尽管分裂是可怕的 低效的测试方式)。找到一个,然后做其他事情 使用另一个i循环,丢失您在第一个中找到的i的值 一,并递归调用ways

现在,请注意您在第二个循环中没有进行测试。这完全是 可以从N中减去大于N的内容,得到一个 否定结果,并通过。这会导致无限递归,没有?

答案 1 :(得分:0)

SIGSEGV错误是分段错误错误,这意味着您尝试访问程序范围之外的内存位置。 这是最常见的,因为取消引用空指针或在for循环中转换。尝试检查代码的逻辑。

我认为当你输入*(p + 1)时,你会在某个时候出界。尝试使用断点进行调试或在for循环中输出*(p + 1)的值。