【问题标题】:Segmentation fault in merge sort program归并排序程序中的分段错误
【发布时间】:2017-01-11 08:13:27
【问题描述】:

我为合并器制作了以下 c 程序。然后我在我的系统上使用 gcc 编译器执行它,它给出了分段错误。我无法弄清楚程序中的什么导致了这个错误。请帮忙。

#include<stdio.h>
void mergersort(int A[], int, int);
void merge(int A[], int, int, int);

void merge(int A[], int middle, int p, int q) {
    int buffer1[30], buffer2[30], i, j, k, n1, n2;
    n1 = middle-p+1;
    n2 = q-middle;
    for (i = p; i <= middle; i++) {
        buffer1[i-p] = A[i];
    }
    for (j = middle+1; j <= q; j++) {
        buffer2[j-i] = A[j];
    }
    i = 0; j = middle; k = 0;
    while (i!=n1 || j!=n2) {
        if (buffer1[i] <= buffer2[j]) A[k++] = buffer1[i++];
        else A[k++] = buffer2[j++];
    }
    while (i != n1) {
        A[k++] = buffer1[i++];
    }
    while (j != n2) {
        A[k++] = buffer2[j++];
    }
}

void mergesort(int A[], int p, int q) {
    if (p < q) {
       int middle = (p+q)/2;
       mergesort(A,p,middle);
       mergesort(A,middle+1,q);
       merge(A,middle,p,q);
    }
}

int main() {
    int A[] = {56,23,33,1}, i;
    mergesort(A,0,3);
    for (i = 0; i < 4; i++)
        printf("%d", A[i]);
    return 0;
}

更新:我解决了这个问题。我应该多加注意。除了我更改后解决的分段错误||到&&,输出不正确。而不是合并过程中的 k=0,它应该是 k=p。

【问题讨论】:

  • 分段错误 -> 调试!!
  • 你输入了多少个元素?
  • @GoodDeeds {56,23,33,1}

标签: c segmentation-fault mergesort


【解决方案1】:

在merge()中i,j,k的赋值

i = 0; j = middle; k = 0;
while (i!=n1 || j!=n2) { ...

应该改成这个

i = 0; j = 0; k = p;
while (i!=n1 && j!=n2) {...

【讨论】:

  • 谢谢。这是一个愚蠢的错误。我想这就是导致错误的原因。错误不再发生。
【解决方案2】:

更改此代码:

if (buffer1[i] <= buffer2[j]) A[k++] = buffer1[i++];
else A[k++] = buffer2[j++];

到这里:

if (buffer1[i] <= buffer2[j]) {
    printf("in if : i = %d : k = %d\n", i, k);
    A[k++] = buffer1[i++];
} else {
    A[k++] = buffer2[j++];
}

现在运行您的程序。发生分段错误时,请查看您尝试用于访问数组的索引:

in if : i = 516 : k = 528
Segmentation fault: 11

现在你看到你的问题了,我确定。

【讨论】:

  • 是的,感谢您的建议。这使得调试更容易。
  • 记得选择一个答案作为“答案”。我认为@rakinhaider 给了你最好的。
猜你喜欢
  • 1970-01-01
  • 2021-08-01
  • 2020-03-13
  • 2022-10-15
  • 2020-11-30
  • 2018-10-18
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
相关资源
最近更新 更多