2016-10-19 15 views
0

私はこのコードを実行しながら、それが言うことを見つける: Thread1:EXC_BAD_ACCESS(code=1,address=0x7fff3010efcc)なぜこのコードはセグメンテーションフォールトを持っていますか?

コード:

#include <iostream> 
using namespace std; 
int main() 
{ 
int d[20],n,k,j,i,a[100000000],count=0; 
//long long int i,a[100000000]; 
cin>>n>>k; 
for(i=0;i<k;i++) 
{ 
    cin>>d[i]; 
} 
for(i=0;i<n;i++) 
{ 
    a[i]=i; 
} 
for(i=0;i<n;i++) 
{ 
    for(j=0;j<k;j++) 
    { 
     if(a[i]%d[j]==0) 
     { 
      a[i]=0; 
     } 
    } 
} 
for(i=0;i<n;i++) 
{ 
    if(a[i]!=0) 
    { 
     count++; 
    } 
} 
cout<<count; 

} 
+0

ありがとう@sisanared –

+0

これには複数のバグがあります。この執筆時点での各回答は、1つのバグを強調しています。 – Charles

答えて

0

我々はnkの値がわからない場合、我々はあなたの質問に適切に対応することはできませんが。あなたはkに値21を与えた場合、あなたが書いた例により、

cin >> d[i])の位置20d。これはセグメンテーションフォルトを引き起こす可能性があります。

提案:

1)デバッガ

2でプログラムを実行します)operator[]代わりnk

3の値を確認してください)とstd::vector代わりに、古いCスタイルの配列を使用してat() (例えば、cin >> d.at(i),a.at(i) = i等の代わりに、cin >> d[i],a[i] = iなど)。at()はバインドチェックを実行するためです。

+0

nの値は、1≦n≦1000000000と1

+0

[http://opc.iarcs.org.in/index.php/problems/LEAFEAT] –

+0

@ Raikan10 - 'a'次元(' 1000000000の代わりに100000000)。 AVK(+1)が指すように、 'a'はスタックのために大きくなります。だから、 'std :: vector'や' std :: deque'(スタックの代わりにヒープ)を使うことをお勧めします。そしてより良い: 'a'の使用を避けてください:あなたはそれを必要としません – max66

1

スタックがオーバーフローしました。 int a[100000000]のサイズが既定のスタックサイズ(Windowsでは1MB)を超えるため、場所はありません

関連する問題