Массив u_int64_t

Я пытаюсь сделать это:

int main(void){
    u_int64_t NNUM = 2<<19;
    u_int64_t list[NNUM], i;

    for(i = 0; i < 4; i++){ 
        list[i] = 999;
    }
}

Почему я получаю segfault на моем Ubuntu 10.10 64 бит (gcc 4.6.1)?

3 ответа

Решение

Вы пытаетесь создать очень большой массив в стеке. Это приводит к переполнению стека.

Попробуйте вместо этого выделить массив в куче. Например:

// Allocate memory
u_int64_t *list = malloc(NNUM * sizeof(u_int64_t));

// work with `list`
// ...

// Free memory again
free(list);

Вы заявляете NNUM = 2*2^19 == 2<<19 == 1048576,

и попробуйте выделить в стеке 64 бита * 1048576 = количество бит * количество ячеек. это 8.5 MegaBytes, это слишком много для выделения в стеке, вы можете попробовать выделить его в куче и проверить, действительно ли он работает, используя возвращаемое значение malloc,

куча VS. стек

Ваша программа требует минимальный размер стека 1048576, если вы проверяете с помощью 'ulimit -s', скорее всего, он меньше. Вы можете попробовать 'ulimit -s 16384' и затем снова выполнить.

Другие вопросы по тегам