随机运行中的分段故障

时间:2014-02-02 05:25:07

标签: c sorting file-io segmentation-fault quicksort

下面的代码从输入文件中读取元素,并使用动态数组对其进行快速排序。

输入文件:

4
3
6
2
1
5


#include<stdio.h>
#include<stdlib.h>

typedef struct{
    int num;
}Element;
typedef Element* List;
typedef int Location;

Location doPartition(List list,Location start,Location end){
    srand(time(NULL));
    int p,size=sizeof(Element),temp,r=rand()%(end-start+1);
    Location i,j;
    r = r + start;

    temp = (list+r)->num;
    (list+r)->num = (list+end)->num;
    (list+end)->num = temp;

    i=start-1;
    j=end+1;
    p=(list+end)->num;
    while(1){
        while(j>=start){
            j--;
            if((list+j)->num <= p)
                break;
        }
        while(i<=end){
            i++;
            if((list+i)->num >= p)
                break;
        }
        if(i<j){
             temp = (list+i)->num;
            (list+i)->num = (list+j)->num;
            (list+j)->num = temp;
        }
        else
            return j;
    }
}
void quickSort(List list,int s,int e){
    Location p;
    if(s<e){
        p=doPartition(list,s,e);
        quickSort(list,s,p);
        quickSort(list,p+1,e);
    }
}
void Sort(List list,int list_size){
    quickSort(list,0,list_size-1);
}

int main(){
    FILE *fp = fopen("C:/Users/Johny/Desktop/input.txt","r");
    int n,f,num,i=0,size=sizeof(Element);
    List list=NULL;
    while((f=fscanf(fp,"%d",&num))!=EOF){
        i++;
        list=(List)realloc(list,i*size);
        (list+i-1)->num = num;
    }
    n=i;
    Sort(list,n);
    for(i=0;i<n;i++)
        printf("%d ",(list+i)->num);
    fclose(fp);
    return 0;
}

我面临的问题是,当我反复运行程序时,会在随机运行中出现分段错误。为什么会发生这种情况?

3 个答案:

答案 0 :(得分:1)

while(j>=start){
    j--;
    if((list+j)->num <= p)
        break;
}

你对循环的测试是错误的。假设j==start。然后循环将继续并递减j,然后是start-1。然后,该数组的元素可能超出范围。访问超出范围的元素会导致未定义的行为,这可能表现为分段错误。

你在这里做同样的事情:

while(i<=end){
    i++;
    if((list+i)->num >= p)
        break;
}

答案 1 :(得分:0)

看起来很可疑

i=start-1;
j=end+1;

你可能在第一次调用dopartition时访问list -1和list + 1,导致seg fault。

答案 2 :(得分:0)

在你的文件指针中,为什么不把文件放在c文件所在的位置,这样就不必放置路径了。我觉得这可能会导致问题。