2016-09-03 6 views
-7

mergesorのために以下のCプログラムを作成しました。それから私はgcc compierを使って私のシステムでそれを実行し、それはセグメンテーション違反を与えました。プログラムで何が原因でこのエラーが発生しているのかわかりません。助けてください。マージソートプログラムのセグメンテーションフォルト

#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でなければなりません。マージ内部

+6

セグメンテーションフォルト - >デバッグ! –

+0

入力にいくつの要素を付けましたか? – GoodDeeds

+0

@ GoodDeeds '{56,23,33,1}' –

答えて

1

()Iの割り当て、J、

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

このコードを変更し、この

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

ありがとうございます。それは愚かな間違いでした。私はそれが間違いを引き起こしていたと思います。エラーはもう発生しません。 – nitangle

1

に変更する必要がありkはこれに

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 

:あなたは、セグメンテーションフォールトが発生したときにアレイへのアクセスに使用しようとしているインデックスを参照してください。

+0

はい、ありがとうございます。これにより、デバッグが容易になりました。 – nitangle

+0

回答を「回答」として選択することを忘れないでください。私は@rakinhaiderがあなたに最高のものを与えたと思う。 – jwpfox

関連する問題