Получил segfault на MacBook Pro с индексированным массивом 24 + бит - PullRequest
2 голосов
/ 23 июня 2010

Я использую GCC + терминал для создания массива простых чисел.

Однажды я спросил на #C@irc.freenode.net, но я все еще не понимаю:

Int может хранить значения в 32 битах (таким образом, всего 2 ^ 32 уникальных значения), но массив не может иметь более 2 ^ 24 значений?

Я не уверен, но это Почему 24-разрядные регистры? уже отвечает на мой вопрос?

И означает ли это, что создание массива long int не решает проблему?Есть ли какой-то (относительно быстрый) способ, которым я могу обойти это, например, использовать int[][] для хранения этих чисел?Или может быть include или lib для использования произвольного числа байтов для хранения чисел?



    int main()  
    {  
        int array1[160000];  
        printf("first array declared fine.\n");  
        int array2[170000];  

        int array3[1600000];  
        printf("first array declared fine.\n");  
        int array4[1700000];  

        int array5[16000000];  
        printf("first array declared fine.\n");  
        int array6[17000000];  
    }

1 Ответ

5 голосов
/ 23 июня 2010

Поскольку вы создаете свои массивы в стеке, я полагаю, что ваша ошибка вызвана переполнением стека. Я бы предложил создать такие большие массивы в куче, например:

int* array = malloc(17000000 * sizeof(int));

Таким образом, причина, по которой вы получаете segfault, не имеет ничего общего с использованием индексов, превышающих 2 ^ 24, но с тем фактом, что размер всех ваших массивов вместе превышает размер стека, вызывая переполнение стека.

...