2016-03-30 14 views
1

私は一般的なクイックソートを記述しようとしています:一般的なクイックソートの何が問題になっていますか?

void _qsort(void *ptr, 
     size_t lrange, 
     size_t rrange, 
     size_t size, 
     int (*cmp)(const void *, const void *)) 
{ 
    if (lrange < rrange) { 
     size_t i, j; 
     void *key; 

     key = malloc(size); 
     i = lrange; 
     j = rrange; 
     memcpy(key, ptr + i * size, size); 
     while (i < j) { 
      while (i < j && (*cmp)(ptr + j * size, key) > 0) 
       j--; 
      if (i < j) { 
       memcpy(ptr + i * size, ptr + j * size, size); 
       i++; 
      } 
      while (i < j && (*cmp)(key, ptr + i * size) > 0) 
       i++; 
      if (i < j) { 
       memcpy(ptr + j * size, ptr + i * size, size); 
       j--; 
      } 
     } 
     memcpy(ptr + i * size, key, size); 
     _qsort(ptr, lrange, i - 1, size, cmp); 
     _qsort(ptr, i + 1, rrange, size, cmp); 
    } 
} 

私はint配列の簡単なテストを書き、これをCMP funcitonです:

int cmp(const void *x, const void *y) 
{ 
    return *(int *)x - *(int *)y; 
} 

これは、コア・ダンプを引き起こすが、ときに私lrange, rrange, i, jのタイプをsize_tからintに変更すると、正しく実行されますが、わかりません。なぜですか?

+1

'size_t'とはなぜクラッシュするのかを理解するために[この質問](http://stackoverflow.com/questions/2550774/what-is-size-t-in-c)を見てください。ヒント:おそらくmemcpyが動作しているからでしょう。しかし、あなたは近くにいる。 – Shark

+0

コアダンプをデバッグするのはなぜですか? – kamikaze

+0

このコアダンプをデバッグするときに問題があります。「malloc.c:No such file or directory」です。 – protream

答えて

2
size_t i, j; 

は、符号なしタイプです。符号なし変数の値が0で、1が減算された場合、値はその符号なし型の可能な最大値にラップアラウンドされます。

これはライン上で発生する可能性があります。プログラムは読むことができないとして、配列のインデックスとして使用されている無効な値が、それはワンセグ障害の原因となる場合は

_qsort(ptr, lrange, i - 1, size, cmp); 

j--; 

と境界外のアドレス。これらは、実装のために予約されているよう


は、接頭辞__qsortで名前を使用しないでください。

+0

私はポイントを得たと思います。しかし、私はどのように私のコードを変更できますか? – protream

+0

@protream値を折り返したり、符号付きの型を使用したりしないでください。 (これらの関数の名前を変更することを忘れないでください) – 2501

+0

@protreamそれは答えに説明されています。 – 2501

3
memcpy(key, ptr + i * size, size); 

ptrvoid *である、あなたは(標準ライブラリでqsortとして)char *に切り替え、void *でポインタ演算を使用することはできません。

+2

きれいに見つかった。これを避けるには、標準準拠のコンパイラを使用します。たとえば、 'gcc -std = c11 -pedantic-errors //は' gccよりも優れたCコンパイラを提供します//非標準のcrapilerを返します ' – Lundin

関連する問題