1

素数を生成unsigned int countし、それらをグローバルに宣言された動的に割り当てられた配列に格納する素数ジェネレーターnumList globalPrimesnumList is just がありtypedef unsigned int *numListます。count の値が 0 の場合、それは無視され、count が 0 でない限り、以前に計算された素数の値が無視される値を超えるまで素数が計算さunsigned int untilれます。

numList getPrimes(unsigned int count, unsigned int until)
{
    unsigned int i, j;
    unsigned int p = 0;
    char b=1;
    if(globalPrimes==NULL)
    {
        b=0;
        globalPrimes = calloc(count>0? count:until, sizeof(int));
        if(globalPrimes==NULL)
        return NULL;
    }
    globalPrimes[0]=2;   //set first 2 prime #'s in list
    globalPrimes[1]=3;
    for(i=2, p=5; count!=0? (i<count):(globalPrimes[i-1]<=until); p+=2)  //iterate until it finds every prime number. Increments p by 2 starting from the third prime
    {
        if(globalPrimes[i]!=0)  //if the current prime was preordained (a value was set already) skip to the next prime
        {
            p=globalPrimes[i++];
            continue;
        }
        else if(globalPrimes[i]==0)  //if it is 0, allocate the extra memory and find next prime
        {
            if(b)
                globalPrimes=(numList)realloc((void *)globalPrimes, sizeof(int)*((count==0)? (until):(count+1)));
            b=0;
        }

        for(j=0; (p%globalPrimes[j]) && globalPrimes[j]*globalPrimes[j]<p; j++);  //loop through all previous primes until past half of p
        if(p%globalPrimes[j])   //if the prime is still not divisible by the previous prime
            globalPrimes[i++]=p;   // save as the next prime
    }
    globalPrimes[i]=0;
    globalPrimes=(numList)realloc((void *)globalPrimes, (i+(i%2)+1)*sizeof(int));
    return globalPrimes;
}

いくつかのテスト中に、奇妙なエラーが見つかりました。reallocnetBeans (gcc コンパイラ)の最後から 2 番目の行で、実行時例外のようなものと思われる「シグナル」が表示されます。ダイアログ ボックスには、エラーが SIGABRT であることが示され、デバッグ モードでない間はプログラムが中止されます。このエラーは、count が奇数の場合にのみ発生することがわかりました。常に偶数を渡すように realloc の引数を変更しても、まだエラーが発生します。しかし、count を変更して関数の先頭のみにすると、正常に動作します。この奇妙な詳細がこの奇妙な動作を引き起こす理由がわかりません。

4

1 に答える 1

1

この線

globalPrimes[i]=0;

最後にメモリが破損する直前に、realloc()割り当てた配列の最後を過ぎた書き込みです。

次のように配列を割り当てたいと思います:

globalPrimes = calloc(count>0? (count + 1):until, sizeof(int));

これまでのところ、関数が非ゼロで呼び出されるケースだけを見てきましたcountcount == 0関数が呼び出され、untilターゲット素数で ある場合、どのような問題が発生する可能性があるかは正直わかりません。

于 2012-12-05T01:37:38.880 に答える