Working with large integer arrays

≡放荡痞女 提交于 2019-12-24 13:15:23

问题


How to work with large integer, do I need GMP libraries or something?
I want an array that has elements starting from 0 to 2^32
How to get this to work:

#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;
}

error: process exited with return value 3221225725
is it that the array is too big or something??


回答1:


According to Google, your A array is approximately 17 gigabytes. That's a lot. You're probably overflowing the stack.

If you really need this much memory, you may be able to malloc() it instead, but on older 32-bit architectures, you're basically out of luck (address space has a hard upper limit of 4 GB, minus kernel space).




回答2:


You are allocating an array of 16-17GB which overflows the stack. As haccks said you can try allocating on heap.

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

Don't forget to free afterwards:

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

And you also have a bug in your code. Array is indexed from 0 to size - 1. This will when i becomes sz write to invalid memory.

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

Change to:

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



回答3:


Memory for arrays is allocated on stack and its size is generally small and will result in stack overflow. You need to allocate memory on heap for such a large array. Either place

unsigned int A[429496729];  

out side the main or use dynamic memory allocation

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

Use free(A) to free the allocated memory once you are done with A.




回答4:


Better use define constants from limits.h, such as UINT_MAX or ULONG_MAX, and check what type is used for indexing of arrays (perhaps your unsigned int transformed to int)



来源:https://stackoverflow.com/questions/28462050/working-with-large-integer-arrays

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!