這裏我試圖在c中實現erastosthene篩選。除了一個主要問題外,程序工作正常。我手動將第一個素數設置爲值2。當我循環遍歷所有素數數組並打印它們時,第一個值變爲1而不是2.無法找出爲什麼會出現此問題。任何幫助都將非常感謝。爲什麼第一個素數總是變成1而不是2
#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]);
}
}
此違反(i = 4; i <= n; i = i + 2)mark [i] = 1;'。該數組只有64個元素,索引從0..63。上面的循環會寫入'mark [64]',調用*未定義的行爲*(並覆蓋您的'prime'插槽0作爲獎勵.'''應該是'<'。 – WhozCraig
好的,謝謝...但爲什麼它會覆蓋素數組?:| –
因爲它*可以* .UB調用意味着*任何*可能發生(包括不幸的情況,它甚至似乎工作*正確*)。在架構上可能依賴於自動變量被分配到它們的實現堆棧空間中,很高興你抓住了它,UB是沒有趣味的地方。 – WhozCraig