为什么错误"分段错误"这里?

时间:2016-08-13 02:18:10

标签: c segmentation-fault

我尝试实现Selection sort的递归形式。但错误为"分段错误"正在展示。错误在哪里?递归算法通常会遇到哪些错误?

#include <stdio.h>
void ssort(int[],int,int);
void prints(int[],int);
void sorting(int[],int,int);

int a[]= {5,6,3,1,2,4};

int main()
{
    ssort(a,0,6);
    prints(a,6);
    return 0;
}

void ssort(int a[],int s,int e)
{
    int min=a[s];
    int ch,p,j;
    for(j=s+1; j<e; j++)
    {
        if(min>a[j])
        {
            min=a[j];
            ch=j;
        }
    }
    sorting(a,j,ch);
    if(s+1<e)
    {
        ssort(a,s+1,e);
    }
}


void prints(int a[],int n)
{
    int i;
    for(i=0; i<n; i++)
        printf("%d",a[i]);
}

void sorting(int a[],int j,int ch)
{
    int p=a[j];
    a[j]=a[ch];
    a[ch]=p;
}

2 个答案:

答案 0 :(得分:1)

访问非法内存时会引发分段错误。有可能排序(a,j,ch);&#34;即使代码可能没有通过预先存在的for循环中的if块,也可能被调用。在那种情况下,&#34; ch&#34;可能是不可预测的,然后当你访问排序(..)函数内的[ch]时,它可能会访问一些非法的内存,这将导致分段错误

答案 1 :(得分:1)

BLUEPIXY在这个问题上的评论几乎解决了这个问题。写这个来添加为什么需要这些更改。

问题1:在递归的每个步骤中,您将最小值存储在第一个索引中(针对该递归级别)。要首先执行此操作,请确定最小值的索引,您在代码中使用ch进行扫描。然后,您将第一个索引中的值与具有最小值的索引进行交换。这意味着您的代码应该交换索引sch中的值。但是,您正在交换最后索引中的值和具有最小值的索引。所以你需要进行以下更改:

/* sorting(a,j,ch); */   // ISSUE:   you are swapping with last index
sorting(a, s, ch);       // CORRECT: you are swapping with first index

问题2:如果条件if(min>a[j])永远不为真,则永远不会执行ch = j;ch将具有不确定的值。然后,当您致电sorting(a, s, ch);时,您的程序将无法获得确定性结果,甚至可能会崩溃。因此,您必须将s设置为beggning的最小索引,如下:

/* int ch,p,j; */ 
int ch = s, p,j;    // Initialize ch with starting index

这些更改可以解决您的问题。但是,您可以进行的一项更改是,仅在需要时交换值:

/*sorting(a,j,ch);*/
if (ch != s)
    sorting(a, s, ch);

最后,您可能希望将函数sorting的名称更改为swap