
[code]

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX_A 10
    #define MAX_B 100
    
    void quickSort(int (*E)[MAX_B]);
    void q_sort(int *E, int left, int right);
    
    int main(void) {
      int i, j;
      int E[MAX_A][MAX_B];
    
      for(i = 0; i < MAX_A; i++) {
        for(j = 0; j < MAX_B; j++) {
          E[i][j] = rand() % MAX_B;
        }
      }
    
      quickSort(E);
      for(i = 0; i < MAX_A; i++) {
        for(j = 0; j < MAX_B; j++) {
          printf("%d\t", E[i][j]);
        }
        printf("\n");
      }
    
      return 0;
    }
    
    void quickSort(int (*E)[MAX_B]) {
      int i;
      for(i = 0; i < MAX_B; i++) {
        q_sort(E[i], 0, MAX_B - 1);
      }
    }
    
    void q_sort(int* E, int left, int right) {
      int pivot, l_hold, r_hold;
    
      l_hold = left;
      r_hold = right;
      pivot = E[left];
    
      while(left < right) {
        while((E[right] >= pivot) && (left < right)) {
          right--;
        }
        if(left != right) {
          E[left] = E[right];
          left++;
        }
        while((E[left] <= pivot) && (left < right)) { 
          left++;
        }
        if(left != right) {
          E[right] = E[left];
          right--;
        }
      }
      E[left] = pivot;
      pivot = left;
      left = l_hold;
      right = r_hold;
      if(left < pivot) {
        q_sort(E, left, pivot-1);
      }
      if(right > pivot) {
        q_sort(E, pivot+1, right);
      }
    }
    
[/code]

C言語でソートを行うプログラムを書いたのですが, Segmentation faultになってしまいます.  
どこが間違っているのでしょうか?

* * *

出力例 :  
1 2 3 3 5 5 6 6 7 9  
0 0 2 2 3 6 6 6 7 9  
0 1 2 2 3 5 7 7 8 9  
1 2 2 2 3 6 7 8 9 9  
0 1 3 4 4 5 7 8 9 9  
0 0 1 1 2 3 3 6 6 6  
3 4 5 5 5 6 6 7 7 9  
0 2 3 4 4 4 4 5 5 7  
1 3 4 4 6 7 8 8 8 9  
0 2 2 4 6 6 6 8 9 9


CC BY-SA 3.0
2015-11-14T10:26:50.497
18812
2018-01-25T13:11:17.253
2018-01-25T13:11:17.253
19110
10019
question
c
C言語でのソートプログラムが Segmentation fault になる


とりあえず`quickSort()`の中で`i`が`MAX_B`までループされていますがこれは`MAX_A`までのはずです。


CC BY-SA 3.0
2015-11-14T10:35:34.687
18813
2015-11-14T10:35:34.687
4236
18812
answer


  1. コンパイルするときに、-g オプションで、シンボル生成する。
  2. デバッガーで、実行形式ファイルを、ロードし、実行させる。
  3. コケるときに、どの行で、コケたか、表示される。

もし、こけたときに、Core Dump してないなら、ulimit -c unlimitedなどとして、Coreダンプするようにしておく。

なお、qsortは、Cの標準ライブラリにあるので、普通は、自作しないものである。


CC BY-SA 3.0
2015-11-14T11:32:42.300
18814
2015-11-14T11:32:42.300
75
18812
answer