1

tmp = pow(p[i],j);コンパイラはwhilep[i]でSIGSEGV をスローしj、2 つの整数でありp[i]、 array の有効な要素ですp。理由は本当にわかりません...

元のコードはこちら: http://pastebin.com/DYhGeHxm

4

2 に答える 2

6

次のことに気付きましたか。

int i,j,p[2000], a[5000000],num,count,tmp;

スタックスペースの瀬戸際にあなた追い込んでいる可能性がありますか? あれは

4 + 4 + 8000 + 20000000 + 4 + 4 + 4

バイト

つまり、19.08 メガバイトのスタック空間宣言があります。a少なくとも動的に割り当てることを検討してください。私がそれを次のように変更したとき:

int *a = malloc(5000000 * sizeof(*a));

コードを再実行すると、セグフォルトを大幅に回避できました。残念ながら、この場所で死亡しました。

count = 0;
for(i = 0; i < num; i++) {
    for(j = 2; ;j++) {
        tmp = pow(p[i],j);
        if(tmp > 5000000) break;
        a[count++] = tmp; // <=== faulted here, count was 5000193
    }
}

の割り当てられた最大サイズに達すると、両方のループが壊れるはずですa[]。私は次のことをしました。の上部main():

static const int a_max = 5000000;
int *a = malloc(a_max*sizeof(*a));

ループの中で:

count = 0;
for(i = 0; i < num && count < a_max; i++)
{
    for(j = 2; count < a_max; j++)
    {
        tmp = pow(p[i],j);
        if(tmp > 5000000)
            break;
        a[count++] = tmp;
    }
}

これにより、すべてのセットアップが完了します。最後に、クイックソート アルゴリズム自体も壊れているように見えます。それをデバッグするには、小さいデータサイズから始めることを強くお勧めします。

幸運を祈ります。


編集参照用のクイックソートアルゴリズムが必要な場合に備えて、ジャンクフォルダーの1つにあるソースファイルに1つありました。それが正しいことを保証するものではありません(確かにそうであり、長さ1のソートもスキップします)が、ハングしないことはわかっているので、それはうまくいきます= P

// quicksort for ints
static void quicksort_ints(int *arr, int left, int right)
{
    int p = (left+right)/2;    // as good as any
    int l = left, r = right;   // movable indicies

    while (l <= r)
    {
        while (arr[l] < arr[p])
            ++l;
        while (arr[r] > arr[p])
            --r;
        if (l <= r)
        {
            int tmp = arr[l];
            arr[l] = arr[r];
            arr[r] = tmp;
            ++l;
            --r;
        }
    }

    if (left < r)
        quicksort_ints(arr, left, r);
    if (l < right)
        quicksort_ints(arr, l, right);
}
于 2013-01-29T09:17:58.800 に答える
0

の値を確認してくださいip配列に対して大きすぎる可能性があります。デバッガーでこれを行うことができます。

于 2013-01-29T09:06:33.337 に答える