c - 合并排序的段错误

标签 c

在有一段时间没有接触我的 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”将打印然后“Run merge sort in 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 函数中存在一些数组索引错误。请注意,您在第一个循环期间移动中间 - 这对循环条件有何影响?提示:您需要停在实际中间位置,而不是在开始超过该点后继续前进。

编辑 2:其中也存在一些相差一的错误。

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

关于c - 合并排序的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15213271/

相关文章:

将 double 的堆栈结构转换为类型 void*

C-makefile 和外部库

c++ - 用于动态集群中分布式计算的 C/C++ 框架

C - 将 int 转换为 char

c - 如何使用新的 C99 语法初始化结构?

C - 用于商业用途的良好差分压缩库?

c - 链接列表代码插入到中间,但不理解一行

c - 从多个客户端到服务器的交错消息

c++ - 安排数据包重传

c++ - 使用基本方法对结构进行排序