具有铿锵声的C大阵列中奇怪的分段故障

Obs*_*ive 0 c clang

在这里,我想找到200万以下所有素数的总和.我使用了Eratosthenes的筛子,所以我需要一个200万个阵列.

起初,我只将数组声明为全局变量,但zsh给我一个分段错误.所以我尝试了malloc,但错误仍然存​​在.我已经测试过小数组,程序运行正常.

此外,我使用clang-1000.10.44.2,使用-O2程序可以工作,但答案是不正确的.代码如下.

#include <stdio.h>
#include <stdlib.h>

#define MAXN 2000000

unsigned long long sum;
void erat(int maxn, char *flag)
{
    flag[0] = 0;
    flag[1] = 0;
    for(int i = 2; i < maxn; i++)
        if(flag[i])
            for(int j = i * i; j < maxn; j+=i)
                flag[j] = 0;
}

int main()
{
    int i;
    char *flag = (char*) malloc(MAXN * sizeof(char));
    for(i = 0; i < MAXN; i++)
        flag[i] = 1;
    erat(MAXN, flag);
    for(i = 0; i < MAXN; i++)
        if(flag[i]) sum+=i;
    printf("%llu\n", sum);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

希望有人可以帮助我,谢谢你的时间!

Ala*_*les 5

i46349,i*i2148229801,这是比配合更的整数,以便溢出到-2146737495,因为这是小于maxn,flag[j] = 0则执行这是出数组所以崩溃界.

更改jlong long修复错误:

for (long long j = (long long)i * i; j < maxn; j += i)
Run Code Online (Sandbox Code Playgroud)