2015-02-11 3 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', но почему такой большой массив? Заголовок вопроса вводит в заблуждение. –

+0

@iharob: Я немного смущен этим. Кажется, что ОП умножило пять известных [Фермальные числа] (http://oeis.org/A019434), чтобы получить число, приблизительно равное 2^31. Я не вижу цели этого. – Kevin

ответ

3

Согласно Google, ваш массив A - approximately 17 gigabytes. Это много. Вероятно, вы переполнили стек.

Если вам действительно нужна эта большая память, вы можете использовать ее, но на older 32-разрядные архитектуры, вам в основном не повезло (адресное пространство имеет жесткий верхний предел 4 ГБ, минус ядро пространство).

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, и проверить, какой тип используется для индексации массивов (возможно, ваш беззнаковое целочисленное значение преобразуется в целое)

2

Вы выделяющий массив 16-17GB который переполняет стек. Как говорится, вы можете попробовать выделить на кучу.

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]); 
} 
Смежные вопросы