-4

チューバーソートと呼ばれるアルゴリズムを使用して配列をソートするときに、それを実装し、実行するとセグメンテーション違反が発生します。ネットを検索しても同様のエラーはありませんでしたが、ここに投稿することにしました。このエラーは、for ループの補助配列のサイズを配列のサイズに設定したことが原因である可能性があります。このコードを記述するより良い方法はありますか? 以下、ソースです。

#include <stdio.h>

void TuborSort(int* array) {
  int aux[5] = { 0, 0, 0, 0, 0 };
  int i;

  for (i = 0; i < sizeof(array); i++) {
    aux[array[i]]++;
  }

  int j = 0;
  for (i = 0; i < 5; i++) {
    while(aux[i]-- > 0) {
      array[j++] = i;
    }
  }
}

int main() {
  int array[6] = {2, 5, 1, 4, 1};
  int i;

  TuborSort(array);

  for (i = 0; i < sizeof(array); i++)
    printf("%d ", array[i]);

  return 0;
}
4

3 に答える 3

3

あなたが言っているとaux[array[i]]++、aux の長さはわずか 5 要素です。したがって、(5) の 2 番目の要素はarrayのインデックスとして使用するには大きすぎauxます。


補足として、使用方法sizeofが間違っているため、配列の長さを追加のパラメーターとして渡す必要があります。

アレクセイが指摘するようにmain、 for は次のようにする必要があります。

size_t i;
for (i = 0; i < sizeof(array) / sizeof(*array); i++)
于 2013-03-31T14:30:41.217 に答える
3

sizeof(array)あなたのTuborSort()機能では適切ではありません。あなたが宣言したように、6つの整数の配列でarrayint *なく、これはあなたが望むものではありません。

sizeofまた、配列内の要素の数が必要な代わりに、sizeof(array)/sizeof(array[0]).

于 2013-03-31T14:32:25.517 に答える
0

これは、Java を知っている人にとって非常に一般的なエラーです。c および c++ のポインターは、PC では通常 32/64 ビットのアーキテクチャに由来するサイズです。

配列へのポインターを渡したら、その長さを送信する必要があります。そうしないと、その長さを知ることができません

于 2013-03-31T14:34:45.670 に答える