[英]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;
}
希望有人能幫助我,謝謝您的寶貴時間!
當i
為46349
, i*i
為2148229801
,這超出了整數的范圍,因此溢出到-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.