Почему я получаю segfault в C от объявления большого массива в стеке? - PullRequest
2 голосов
/ 29 июня 2010

Я получаю сегмент по этой строке кода:

int fatblob[1820][286][5];

Почему это?

Ответы [ 5 ]

8 голосов
/ 29 июня 2010

Поскольку ваш сегмент стека меньше, чем 1820*285*5 int с. Обычно это около 1 МБ.

7 голосов
/ 29 июня 2010

Вы пытаетесь выделить 1820 * 285 * 5 * sizeof(int) байт = около 10 МБ (если sizeof(int) == 4).Это, вероятно, больше байтов, чем ваша ОС дает вам для выделения стека по умолчанию, поэтому вы получаете переполнение стека / segfault.

Это можно исправить, запросив дополнительный стек при создании потока, выделяя его в куче.или изменение настроек ОС по умолчанию.

3 голосов
/ 30 июня 2010
int fatblob[1820][286][5];

вы пытаетесь выделить область памяти 180 * 286 * 5 * 4 (пусть размер int = 4), что составляет около 9,8 МБ, поэтому в вашей ОС есть возможность иметь меньший размер стека по умолчанию.

LINUX имеет размер стека 8192 КБ (т.е. 8 МБ).Очевидно, что вы получите переполнение стека, если попытаетесь выделить больше памяти в стеке.

Вы можете попробовать изменить размер стека вашей ОС.В LINUX вы можете попробовать ulimit

ulimit -s <любой размер, который вы хотите, чтобы он был>

как

$ ulimit -s 1024

Надеюсь, это поможет вам.

3 голосов
/ 29 июня 2010

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

1 голос
/ 29 июня 2010

Автоматические переменные (тип по умолчанию) в C обычно располагаются в стеке.Стек - это область памяти, выделенная для каждого потока, и хотя он может расти во многих операционных системах, он всегда имеет ограниченный размер. ответ Данбена довольно хорошо охватывает стек по умолчанию, но если вы используете потоки, вы выделяете новые при создании потоков (например, pthread_attr_setstacksize).В целом, большие выделения лучше выполнять в куче (malloc / new), но даже иногда они могут быть слишком маленькими.Тогда иногда помогают mmap () или подобные.

Куда делся ответ Данбена?Он связан с некоторой информацией об ограничениях стека .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...