#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请在我的代码中找到错误
答案 0 :(得分:2)
您收到细分错误,因为count
是verify()
函数的局部变量,并且在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