2014-12-19 2 views
1

я делал с проблемой, когда я столкнулся ошибки сегментации при объявлении массива, как:Объявление долго длинный массив неподписанных Int размера

long long ways[max+1]; 

где

unsigned int max = findMax(l,T); // l is an unsigned int array and T is an int. 

и findMax является функцией типа:

unsigned int findMax(unsigned int arr[],int size) 

Как я могу это устранить?

+6

Насколько велика 'max'? Вероятно, переполнение стека. –

ответ

2

Вероятная причина в том, что массив слишком большой для стека.

Типичные размеры стеков на данный момент составляют 1-16 Мб (во встроенной системе может быть значительно меньше). Если long long - это 8 байтов, это означает, что выделение одного массива из более чем 125000 элементов может быть проблематичным. И вы также хотите оставить место для других автоматических переменных.

Действительно большие массивы не должны выделяться в стеке.

Вы могли бы попытаться выделить его в куче вместо:

long long *ways = calloc(max+1, sizeof *ways); 
if (ways == NULL) { 
    // allocation failed!! 
} 
// Do stuff. 
free(ways); 
+1

Незначительная идея: 'long long * ways = calloc (max + 1, sizeof * ways),' style вместо. ИМО, проще кодировать и поддерживать. – chux

+1

@chux Согласен! Таким образом, есть одно меньшее место для изменения, если вы хотите изменить тип массива. –

+0

Простите, я не вижу разницы между этими двумя. – Chandan

Смежные вопросы