c - SIGSEGV сообщил о голове использования ()

Компилятор бросил SIGSEGV в tmp = голова (p [я], j); , в то время как p [я] и j являюсь двумя целыми числами и p [я] являюсь действительным элементом множества p , я действительно не знаю почему...

Original code is here:http://pastebin.com/DYhGeHxm

1
nl ja de
Ценность @tehwalrus меня isn' t получение больше, чем 2000
добавлено автор CDT, источник
@Vinska я просто отладил линии не после 47
добавлено автор CDT, источник
добавьте операторы контроля перед каждым пунктом, где вы звоните p [я] вроде утверждаю (я <2000); - это должно позволить вам ловить где you' ре, превышающее конец множества (который является почти наверняка, куда Ошибка Seg прибывает из). В целом, it' s всегда лучшая практика, чтобы образовать петли по индексу массива непосредственно, а не другим числам, вы думаете, коррелируется.
добавлено автор tehwalrus, источник
Я didn' t средний, чтобы подразумевать только p - везде, где вы используете pointer_variable [я] , необходимо всегда знать, что я буду меньше, чем длина, также потому что you' ре в петле, которая явно только идет, что далеко, или потому что вы утверждаете() . it' s самый безопасный путь, и это показывает вам, какая линия ошибки происходят на (в отличие от segfault). можно удалить утверждение (предпочтительно с флагом препроцессора, таким образом, можно повторно позволить им) для производства, если вы заботитесь о работе.
добавлено автор tehwalrus, источник
Кроме того, , в то время как петля линия 56 - it' s бесконечный цикл. Вы забывали разрыв заявление?
добавлено автор librin.so.1, источник

2 ответы

Пришло в голову вам что это:

int i,j,p[2000], a[5000000],num,count,tmp;

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

4 + 4 + 8000 + 20000000 + 4 + 4 + 4

байты

Т.е. у вас есть 19.08 мегабайтов декларация стекового пространства. Считайте динамично ассигнующими , по крайней мере. Когда я изменил его, чтобы быть:

int *a = malloc(5000000 * sizeof(*a));

и запустил повторно код, он сделал его хорошо мимо seg-ошибки, которую вы имеете. к сожалению, это умерло в этом местоположении:

count = 0;
for(i = 0; i < num; i++) {
    for(j = 2; ;j++) {
        tmp = pow(p[i],j);
        if(tmp > 5000000) break;
        a[count++] = tmp;//<=== faulted here, count was 5000193
    }
}

Обе петли должны сломаться, когда вы достигаете ассигнованного макс. размера [] . Я сделал следующее. Наверху главного () :

static const int a_max = 5000000;
int *a = malloc(a_max*sizeof(*a));

Вниз в петле:

count = 0;
for(i = 0; i < num && count < a_max; i++)
{
    for(j = 2; count < a_max; j++)
    {
        tmp = pow(p[i],j);
        if(tmp > 5000000)
            break;
        a[count++] = tmp;
    }
}

Это получает вас мимо всей установки. Последняя вещь - сам quicksort алгоритм, который кажется нарушенным также. Я высоко советую начинать с меньших размеров данных отлаживать это.

Всего наилучшего.


EDIT In case you needed a reference quicksort algorithm, i had one sitting in a source file in one of my junk folders. No guarantees its even right (pretty sure it is, and skips length-1 sorts too), but I know it doesn't hang, so it has that going for it =P

// quicksort for ints
static void quicksort_ints(int *arr, int left, int right)
{
    int p = (left+right)/2;   //as good as any
    int l = left, r = right;  //movable indicies

    while (l <= r)
    {
        while (arr[l] < arr[p])
            ++l;
        while (arr[r] > arr[p])
            --r;
        if (l <= r)
        {
            int tmp = arr[l];
            arr[l] = arr[r];
            arr[r] = tmp;
            ++l;
            --r;
        }
    }

    if (left < r)
        quicksort_ints(arr, left, r);
    if (l < right)
        quicksort_ints(arr, l, right);
}
6
добавлено
Я изменил [5000000] к [500], но SIGSEGV остается...
добавлено автор CDT, источник
Огромное спасибо @WhozCraig! Кажется, что malloc должен использоваться на гигантских множествах... I' ll отмечают это.
добавлено автор CDT, источник
Жаль я имею в виду меня don' t думают OP' s проблема стековое пространство, но вы - правильное определение.
добавлено автор TheKingDave, источник
Согласованный я пытался удалить свой пост...
добавлено автор TheKingDave, источник
@CDT, который не является решением. Есть несколько логик ошибки в вашем коде как - письменный. Изменение размера [] на стеке с нигде в вашем коде, на самом деле не используя тот элемент учитывается на основе [] s декларация ( sizeof (a) / sizeof ([0]) ) в орехах. У вас есть код в здесь (часть его неправильно), который ожидает, что он будет 5 миллионами широких элементов. Изменение его к 500 и просто удар кнопки запуска isn' t собирающийся получать вас где угодно.
добавлено автор WhozCraig, источник
@TheKingDave это была легко начальная проблема. Есть много других в коде, но это заканчивает тот. Я уже указал на тот. Посмотрите на тест на tmp> 5000000 , чтобы сломать ту петлю. Как тот защищенный учитывается ++ от заполнения множества? Как я сказал, есть другие проблемы, но это было showstopper с самого начала.
добавлено автор WhozCraig, источник
@CDT хорошо. там вы идете. следуйте за этим, и я должен получить хорошую возможность получения вас к вашему quicksort, которым управляют (который висит, btw, таким образом, есть граничный просчет где-нибудь там). Жаль я don' у t есть время, чтобы отладить это. всего наилучшего вам.
добавлено автор WhozCraig, источник

Проверьте ценность я . Могло бы быть слишком большим для p множество. Можно сделать это с отладчиком.

0
добавлено
SIGSEGV брошен в i=0
добавлено автор CDT, источник
@Ed Излечивают Спасибо, Крэйг указал на мою ошибку
добавлено автор CDT, источник
Согласованный я также думаю, что это - осуществление домашней работы... Не уверенный в правилах.
добавлено автор TheKingDave, источник
Каковы значения p [я] и j ], что вы обнаружили использование отладчика?
добавлено автор Ed Heal, источник