2015-02-11 42 views
1

如何使用大整數,我需要GMP庫還是什麼?
我想有開始從0到2^32
元素如何得到這個工作的數組:使用大整數數組

#include <stdio.h> 
int main(){ 
unsigned int i,j=0,sz=4294967295; 
unsigned int A[sz]; 

A[j]=0; 

for(i=1;i<=sz;i++){ 
    A[i]=A[j]+1 ; 
    j++; 
printf("%u\n",A[i]); 
}  
return 0; 
} 

錯誤:過程有返回值退出3221225725
是該數組太大或者其他的東西??

+0

爲什麼這麼大?我雖然你問的是類型寬度,什麼是你可以存儲'unsigned int'的最大值,但爲什麼這麼大的數組?問題標題是誤導性的。 – 2015-02-11 18:50:25

+0

@iharob:我自己對此有點困惑。 OP似乎已經將五個已知的[Fermat素數](http://oeis.org/A019434)放在一起得到一個約等於2^31的數字。我沒有看到那個目的。 – Kevin 2015-02-11 19:24:41

回答

3

根據谷歌,您的A陣列是approximately 17 gigabytes。好多啊。你可能會溢出堆棧。

如果你真的需要這麼多的內存,你可能可以用malloc()來代替它,但是在32位體系結構上,你基本上運氣不好(地址空間的硬件上限爲4GB,減去內核空間)。

1

數組的內存分配在堆棧上,其大小通常很小,並且會導致堆棧溢出。您需要在堆上分配內存來處理這麼大的數組。無論是地方

unsigned int A[429496729]; 

出側main或使用動態內存分配

unsigned int *A = malloc(sizeof(int)*sz); 
if(A == NULL) 
    exit(0); 

使用free(A)釋放所分配的內存,一旦你與A完成。

0

更好地利用從limits.h定義常量,如UINT_MAX或ULONG_MAX,並檢查使用何種類型的數組進行索引(也許你的unsigned int類型轉換成int)

2

您分配16-17GB的陣列溢出堆棧。由於haccks說你可以嘗試在堆上分配。

unsigned int *A = malloc(sizeof(int)*sz); 
if(A == NULL) { 
    printf("Unable to allocate memory for array.\n"); 
    exit(1); 
} 

不要忘了事後釋放:

... 
    free(A); 
    return 0; 
} 

,你也有一個bug在你的代碼。陣列從0索引到size - 1。 這會在i變成sz寫入無效內存。

for(i=1;i<=sz;i++) { // Will cause invalid memory write 
    A[i]=A[j]+1 ; 
    j++; 
    printf("%u\n",A[i]); 
} 

更改爲:

for(i=1; i < sz; i++) { 
    A[i] = A[j] + 1; 
    j++; 
    printf("%u\n", A[i]); 
}