使用大整数数组

时间:2015-02-11 18:45:43

标签: c int

如何使用大整数,我需要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
是数组太大还是什么?

4 个答案:

答案 0 :(得分:3)

根据Google的说法,您的A数组是approximately 17 gigabytes。这很重要。你可能已经堆满了。

如果你真的需要这么多内存,你可能会malloc()代替它,但在older 32位架构上,你基本上没有运气(地址空间有一个硬上限为4 GB,减去内核空间。)

答案 1 :(得分: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;
}

你的代码中也有一个错误。数组从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]); 
}

答案 2 :(得分:1)

数组内存在堆栈上分配,其大小通常很小,会导致堆栈溢出。您需要在堆上为这么大的数组分配内存。要么放置

unsigned int A[429496729];  

支持main或使用动态内存分配

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

完成free(A)后,使用A释放已分配的内存。

答案 3 :(得分:0)

更好地使用来自limits.h的定义常量,例如UINT_MAX或ULONG_MAX,并检查用于索引数组的类型(也许你的unsigned int转换为int)