Ошибки Ubuntu и Red Hat

У меня есть код C, который успешно работает под Ubuntu, но когда я пытаюсь запустить его на ПК с красной шляпой, он выдает ошибку «Ошибка сегментации (сброс ядра)». Я сузил ошибку до следующего утверждения:

long int encryption[800000][2];

это объявление вызывает сбой кода.

Что я могу сделать? Есть предложения? ура =)


person Syntax_Error    schedule 26.10.2011    source источник
comment
1,6 миллиона указателей. Это совсем немного.   -  person cwallenpoole    schedule 26.10.2011
comment
@cwallenpoole: довольно много бит, на самом деле 12,2 МБ (при условии 64-битных указателей). Не слишком эффектно   -  person sehe    schedule 27.10.2011
comment
@cwallenpoole: Нет, 1,6 миллиона long ints и ровно 0 указателей.   -  person Keith Thompson    schedule 27.10.2011


Ответы (2)


Измените его на

static long int encryption[800000][2];

Или сделайте его глобальным, или используйте malloc.

Или используйте ulimit -s.

person cnicutar    schedule 26.10.2011
comment
я изменил его на static long, и это сработало, однако функция, в которой это использовалось, является многопоточной, поэтому мне пришлось удалить многопоточность. каким-либо другим способом я могу решить это, не выходя на глобальный уровень? спасибо - person Syntax_Error; 27.10.2011
comment
Если вам нужна отдельная копия массива для каждого вызова содержащей его функции, используйте malloc() и free(). (Это также может дать вам возможность выделить только то, что вам нужно, а не полные 1,6 миллиона long ints.) - person Keith Thompson; 27.10.2011
comment
@KeithThompson Разумный совет. - person cnicutar; 28.10.2011

Вы столкнулись с переполнением стека, так как массив размещен в стеке.

Размер стека определяется платформой, зависит от модели и конфигурации потоков, а также от настроек sysctl/ulimit (среди прочего?).

Сделайте массив динамически выделенным или статически выделенным («глобальным»), чтобы предотвратить это.

person sehe    schedule 26.10.2011