繁体   English   中英

合并排序的分段错误

[英]Segmentation Fault with Merge Sort

我最近在没有碰过它一段时间后再次开始刷我的C. 所以,我开始尝试实现合并排序,但在查看这些行大约一个小时之后,我无法确定出现了什么问题。

int main(int argc,char** argv){
    printf("test\n");
    int x;
    int input[] = {1,2,3};
        int start=0;
        int end=2;
    for (x=0;x<5;x++){
        //printf("%i\n",x);
    }
    printf("Run mergeSort in main \n");
    mergeSort(input,start,end);

}

void mergeSort(int input[], int start, int end){
    printf("Running merge %i %i",start,end);
    int middle = (start + end)/2;
    if (start < end){
        mergeSort(input,start,middle);
        mergeSort(input,middle+1,end);
        merge(input,start,middle,end);
    }
}

当我运行这个程序时,第一行“test”将打印然后“在main中运行合并排序”但是

printf("Running merge %i %i",start,end); 

不会被执行,这让我感到困惑。 我找不到任何内存分配问题,或者我错过了一些非常明显的问题。

请注意,合并函数已在侧面实现,但该部分代码与此问题无关,因此我没有包含它。

编辑剩余代码:

void merge(int input[],int start, int middle, int end){
    int save_start = start;
    int temp[end-start+1];
    int index = 0;
    printf("Start merge");
    while (start<=middle || middle+1<=end){
        if (input[start]<input[middle]){
            temp[index] = input[start];
            start++;
        } else {
            temp[index] = input[middle];
            middle++;
        } 
        index++;
    }
    while  (start<=middle){
        temp[index] = input[start];
        start++;
    }

    while (middle+1<=end){
        temp[index] = input[middle];
        middle++;
    }

    int i=0;
    int a;
    for (a=save_start;i<index;a++,i++){
        input[a]=temp[i];
    }

}

很可能你的输出是缓冲的,只是等待打印。 在该字符串中添加\\n或调用fflush(stdout)

就您的分段错误而言,您没有向我们展示足够的代码。 使用调试器获取回溯,您可能会发现更多信息。

编辑:您的merge函数中有一些数组索引错误。 请注意,您在第一个循环中移动到中间 - 这对循环条件有什么作用? 提示:你需要停在实际的中间位置,一旦start越过那一点start不要继续前进。

编辑2:你也有一些一对一的错误。

编辑3:你的|| 应该是&&

我相信你的错误就在这里: while (start<=middle || middle+1<=end)

start<=middle || middle+1<=end 当其中一个或多个为真时, start<=middle || middle+1<=end为true: start<=middlemiddle+1<=end ,导致代码在该循环中读取和写出数组的边界。

当所有这些都为真时, start<=middle && middle+1<=end为true: start<=middlemiddle+1<=end ,导致你的循环中断,否则它可能会读出并写出数组的边界。

你可能的意思是while (start<=middle && middle+1<=end)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM