带条件的递归中的分段错误

时间:2018-03-20 08:26:13

标签: c recursion

#include<stdio.h>

#define SIZE 5

void verify(int a[],int,int);

int main()
{
    int a[SIZE],target,k=0;
    printf("enter the array elemans:\n");

    for(int i=0;i<SIZE;i++)
        scanf("%d",&a[i]);

    printf("enter the target :\n");
    scanf("%d",&target);

    verify(a,target,k);
    return 0;
}

void verify(int a[],int target,int k)
{
    int count=0;
    if(a[k]==target&&count<SIZE)
    {
        printf("target found:%d at index= %d\n",a[k],k);
        verify(a,target,k+1);
        count+=1;
    }
    else if(count<SIZE)
    {
        verify(a,target,k+1);
        count+=1;
    }
    else 
    {
        printf("target not found !!!");
    }
}

当我试图找到一个不在列表/数组中的数字时,我没有得到else语句执行,而是显示分段错误11请在我的代码中找到错误

3 个答案:

答案 0 :(得分:2)

您收到细分错误,因为countverify()函数的局部变量,并且在verify()函数的每次递归调用中,count初始化为0条件count<SIZE始终为true 在每次递归调用verify()时,您都会传递k+1并将数组k a位置的元素与target - &gt;进行比较。 if(a[k]==target&&count<SIZE){....。在一个阶段,k的值将超出数组a的大小。您的程序正在访问超出数组大小的元素,这是未定义的行为,其中包括程序可能会给出分段错误。

根本不需要count变量。只需将k的值与SIZE进行比较,即可确保它不会超出数组大小。

答案 1 :(得分:0)

您必须对数组索引进行一些绑定检查。 (数组访问超出界限是未定义的行为)这里您已经访问了数组索引超出范围。

首先检查访问是否超出范围 - 如果是您从那里返回的情况,否则您访问并检查它。然后进行下一次递归调用。

if(k >= SIZE){
   printf("target not found !!!");
}
else{
   if(a[k] == target){
     ...
   }
   //next call
}

从函数返回时,count变量不存在。在这种情况下,它不是必需的,或者它的使用不清楚。

完整的代码可以像这样简单:

void verify(int a[],int target,int k)
{
    if(k < SIZE)
    {
        if(a[k] == target)
          printf("target found:%d at index= %d\n",a[k],k);
        else 
          verify(a,target,k+1);
    }
    else 
    {
        printf("target not found !!!");
    }
}

答案 2 :(得分:0)

if(a[k]==target&&count<SIZE) and else if(count<SIZE)

始终为true,因为在每次递归迭代中count始终为零,您应该在条件中使用k代替count