如何使用大整数,我需要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 :(得分: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)