2015-02-11 45 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]); 
}