我在這裏遇到了一個真正奇怪的問題。當我使用手動打印語句來輸出int * primesArr的值時,它工作(看似),但如果我嘗試使用for循環執行此操作,它將失敗。我通過gdb運行它,發現它正好在我將數組中的下一個單元格設置爲值'k'的地方崩潰,這隻發生在數字爲素數時。第一次迭代成功(即2設置爲primesArr [0]),然後在嘗試增加數組時嘗試程序Segfaults。但是這隻有在使用for循環時纔會發生。當我創建單獨的打印語句時,我的程序按預期工作。我不知道如何/爲什麼我訪問使用for循環時未被佔用的內存。我確定我在某處執行過一些業餘錯誤,這可能與我如何傳遞指針有關......但我無法確定它的確切根源。我會很感激任何幫助,並提前感謝您。指針分割錯誤
#include<stdio.h>
int genPrimes(int seed, int *test){
int inNumPrimes=0;
for(int k=0; k<=seed; k++){//k is number being checked for primeness
int cnt=0;
for(int i=1; i<=k; i++){//'i' is num 'k' is divided by
if(k%i == 0){
cnt++;
if(cnt > 2){
break;
}
}else{
}
}
if(cnt == 2){
printf("%i IS PRIME\n",k);
*test=k;
test++;//according to gdb, the problem is somewhere between here
inNumPrimes++;//and here. I'd wager I messed up my pointer somehow
}
//printf("%i\n",k);
}
return inNumPrimes;
}
int main(){
int outNumPrimes=0;
int *primesArr;
int n = 0;
n=20;
outNumPrimes=genPrimes(n, primesArr);
printf("Congratulations! There are %i Prime Numbers.\n",outNumPrimes);
//If you print using this for loop, the SEGFAULT occurs. Note that it does not matter how high the limit is; its been set to many values other than 5. It will eventually be set to 'outNumPrimes'
//for(int a=0; a<5; a++){
//printf("%i\n",primesArr[a]);
//}
//If you print the array elements individually, the correct value--a prime number--is printed. No SEGFAULT.
printf("%i\n",primesArr[0]);
printf("%i\n",primesArr[1]);
printf("%i\n",primesArr[2]);
printf("%i\n",primesArr[3]);
printf("%i\n",primesArr[4]);
printf("%i\n",primesArr[5]);
printf("%i\n",primesArr[6]);
printf("%i\n",primesArr[7]);
//
return 0;
}
輸出,帶手動聲明:
$ ./a.out
2 IS PRIME
3 IS PRIME
5 IS PRIME
7 IS PRIME
11 IS PRIME
13 IS PRIME
17 IS PRIME
19 IS PRIME
Congratulations! There are 8 Prime Numbers.
2
3
5
7
11
13
17
19
與
現在for循環:
$ ./a.out
2 IS PRIME
Segmentation fault
謝謝您的額外建議,他們很感激。按照您和其他人的建議,我可以通過顯式初始化緩衝存儲器來修復程序。謝謝! – shelladept