2013-04-16 46 views
-3

爲什麼此代碼給出分段錯誤錯誤? 此代碼是eratosthenes篩的執行。分割錯誤!請調試

#include <stdio.h> 

#define LIMIT 10000000 
#define PRIMES 700000 
int is_prime[LIMIT]; 
int prime[PRIMES]; 

main() 
{ 
    int i, j; 
    for (i = 0; i < LIMIT; i++) 
     is_prime[i] = 1; 
    is_prime[0] = is_prime[1] = 0; 
    for (i = 0; i < LIMIT; i++) 
     if (is_prime[i]) 
      for (j = i*i; j < LIMIT; j += i) 
       is_prime[j] = 0; 

    j = 0; 
    for (i = 0; i < LIMIT && j < PRIMES; i++) 
     if (is_prime[i]) 
      prime[j++] = i; 

    return 0; 
} 
+6

請調試...... –

+0

先用調試信息生成程序,這是用'-g'開關GCC完成。然後在'gdb'調試器中運行你的程序。 –

回答

3
 for (j = i*i; j < LIMIT; j += i) 

所述的i*i有可能溢出,從而導致大的負。這使得隨後的is_prime[j]訪問數組的方式越界。這應該是:

 for (j = i+i; j < LIMIT; j += i) 
+0

非常感謝。 聲明我和j很久很久也會做。 – prakharjain