簡體   English   中英

帶有Clang的C大數組中的奇怪分割錯誤

[英]Weird segmentation fault in C big array with 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;
}

希望有人能幫助我,謝謝您的寶貴時間!

i46349i*i2148229801 ,這超出了整數的范圍,因此溢出到-2146737495 ,因為它小於maxn ,所以執行了flag[j] = 0 ,這超出了數組的范圍,因此崩潰。

j更改為long long可修復該錯誤:

for (long long j = (long long)i * i; j < maxn; j += i)

您在這里溢出了一個int

for (int j = i * i; j < maxn; j+=i)

由於i達到2000000,因此i*i可以大於2 31 ,從而導致溢出和不確定的行為

您可以在外部循環中解決此問題:

for(int i = 2; i < maxn; i++)

您只需要檢查maxn ,因此將其更改為:

for(int i = 2; i * i < maxn; i++)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM