ここで私はerastostheneの篩をcで実装しようとしています。プログラムは1つの大きな問題以外はうまくいきます。最初の素数を値2に手動で設定します。最後にすべての素数配列をループして印刷すると、最初の値は2ではなく1になります。なぜこの問題が発生するのか把握できません。最初の素数は常に2の代わりに1になります
#include<stdio.h>
#include<math.h>
int main(){
int n = 64;
int i,j,limit=sqrt(n)+2,nPrime=0;
int prime[50]={0},mark[64]={0};
mark[1]=1;
prime[nPrime++] = 2;
printf("%d\n",prime[0]); // initialized to 2
for(i=4;i<=n;i=i+2){
mark[i] = 1;
}
for(i=3;i<=n;i=i+2){
if(!mark[i]){
prime[nPrime++] = i;
if(i<=limit){
for(j=i*i;j<=n;j=j+i*2){
mark[j]=1;
}
}
}
}
int k;
int size = sizeof(prime)/sizeof(prime[0]);
printf("%d\n",prime[0]); // changed to 1;
for(k=0;k<size && prime[k]!=0;k++){
printf("%d ",prime[k]);
}
}
この違反あなたの 'mark [64]'配列: 'for(i = 4; i <= n; i = i + 2)mark [i] = 1;'。配列は、0..63から索引付けされた64要素のみです。上記のループは 'mark [64]'に書き出し、*未定義の動作*を呼び出します( 'prime'スロット0をボーナスとして上書きします。)' <= 'は' <'でなければなりません。 – WhozCraig
ok ,,ありがとう...なぜ素数配列を上書きするのでしょうか?:| –
UB呼び出しは何かが起こる可能性があるため(*正しく動作するように見える不運なシナリオも含みます)、アーキテクチャ上、自動変数の方法それらの実装スタックスペースに割り当てられます。あなたがそれをキャッチしてうれしく思います.UBは楽しい場所ではありません。 – WhozCraig