为什么下面的代码会出现分段错误问

时间:2011-08-28 11:52:26

标签: c recursion

我试图使用递归函数在数组中找到最小数。但是我的代码给出了segemtation错误。

main()
{
    int a[5]={2,1,4,5,3};
    int n=1;
    fumi(a,n,a[0],5);
}

fumi(int a[],int n,int min,int t)
{
    if(n==t)
    {
        printf("%d",min);
    }
    if(a[n]<min)
    {
        min=a[n];
    }
    return(fumi(a,n+1,min,t));
}

哪里出错,而且主要不归还任何东西都不是分割错误的原因。

3 个答案:

答案 0 :(得分:4)

在[{1}}之后你也应该return,否则,你检查printf("%d",min);,并且if (a[t] < min)没有被分配。

a[t]

答案 1 :(得分:2)

您的代码非常接近工作。它崩溃的原因是因为递归永远不会停止并且继续部署在数组的末尾。

您正确检查n == t并打印出结果,但之后您不会返回。代码一直运行到无穷大。只需在printf解决问题后添加退货:

void fumi(int a[],int n,int min,int t)
{
    if(n==t)
    {
        printf("%d",min);
        return; // stop recursing
    }
    if(a[n]<min)
    {
        min=a[n];
    }
    fumi(a,n+1,min,t);
}

答案 2 :(得分:2)

执行

if(n==t)
{
    printf("%d",min);
}

它没有返回,而是继续做:

if(a[n]<min)
{
    min=a[n];
}

所以当基本条件满足时它不会返回。因此,fumi函数总是以递归方式调用。

段错误的两个原因:

  1. n超出最大数组长度时,未分配(非法)内存访问会触发它
  2. 由于递归没有返回,我们得到堆栈溢出,导致分段错误。
  3. 以先发生者为准。

    因此,代码所需的更正是在遇到基本条件时返回:

    if(n==t)
    {
        printf("%d",min);
        return;
    }