何がセグメンテーションフォールトを引き起こしていますか?
-
21-09-2019 - |
質問
私は数が素数であるかどうかを判断するプログラムを書き込もうとしています。私はエラトステネスのふるいのオフに、それをベースとしています。とにかく、私のプログラムは、小さな数字(15485863作品)のために動作しますが、私は大きな数字(例:17485863)を使用する場合、私はセグメンテーションフォールトを受けます。私は符号なしlong long型を使用していますし、私は彼らの最大値を超えているとは思いません。私はちょうど私が間違ってやっていることが表示されません。どのような援助のために事前にありがとうございます!
#include <iostream>
#include <limits>
using namespace std;
bool soe (unsigned long long);
int main (void)
{
unsigned long long x = 17485863;
bool q = soe(x);
cout << x << " is ";
if(q)
cout << "prime." << endl;
else
cout << "not prime." << endl;
return 0;
}
bool soe(unsigned long long input)
{
unsigned long long arrayLength = input%2 + input/2;
unsigned long long index = 2;
unsigned long long greatestMult = 0;
bool array[arrayLength];
array[0] = true; //ignore true values in the array
array[1] = true;
do{
array[index] = false;
}while(++index < arrayLength);
index = 2;
do
{
if(input%index != 0)
{
greatestMult = input/index;
while(index*greatestMult > arrayLength)
greatestMult--;
do
{
array[index*greatestMult] = true;
}while(--greatestMult > 0);
do
{
if(!array[index])
break;
}while(++index < arrayLength);
}
else
{
cout << endl << input << " is divisble by " << index << endl;
return false;
}
}while(index < arrayLength);
return true;
}
解決
:あなたはこのようなスタック上の配列を宣言することはできませんbool array[arrayLength];
。プログラムは、あなたが新しい/削除を使用して、ヒープ上でこれを宣言する必要がライン29上にクラッシュされ;
この効果に何か(私はそこに漏れまたは2を有することができるが、あなたのアイデアを得る);
//Beginning on Line 28
bool *array = new bool[arrayLength];
array[0] = true; //ignore true values in the array
array[1] = true;
do{
array[index] = false;
}while(++index < arrayLength);
index = 2;
do
{
if(input%index != 0)
{
greatestMult = input/index;
while(index*greatestMult > arrayLength)
greatestMult--;
do
{
array[index*greatestMult] = true;
}while(--greatestMult > 0);
do
{
if(!array[index])
break;
}while(++index < arrayLength);
}
else
{
cout << endl << input << " is divisble by " << index << endl;
delete [] array;
return false;
}
}while(index < arrayLength);
delete [] array;
return true;
}
出力
g++ -g test.cpp
gdb ./a.out
...clipped...
(gdb) run
Starting program: /Users/nextraztus/a.out
Reading symbols for shared libraries ++. done
17485863 is divisble by 3
17485863 is not prime.
Program exited normally.
(gdb)
他のヒント
C ++の一部であり、どちらも長い長いも自動配列のサイズするために変数を使用していることをしてくださいノート - 彼らはgccのが提供する拡張であり、移植性が問題になる場合に使用すべきではありません。
このような配列の寸法を決める、あなたの問題を解決するには:
bool array[arrayLength];
arrayLength値が大きすぎる場合は、スタックオーバーフロー(したがって、ワンセグ障害)が発生します。代わりのstd ::ベクトルを使用しますが、メモリは無限の資源ではないことに注意してください。
あなたが、配列終わり、過去の最後の要素を上書きすることができますので、* greatestMultは、にarrayLengthに等しくなるようにインデックスの可能性です。
また、そのようなスタックに大きな配列を割り当てるは、オペレーティングシステムに応じて、問題を引き起こす可能性があります。いくつかのシステムは非常に、他の人ができないことスタックを拡大していきます。