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