内存限制超出。分段故障

时间:2013-04-16 09:07:56

标签: c segmentation-fault

为什么此代码会出现分段错误错误? 这段代码是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;
}

1 个答案:

答案 0 :(得分:3)

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

那里的i*i可能会溢出,从而产生较大的否定号码。这使得后续is_prime[j]访问数组的方式超出范围。那应该是:

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