SIGSEGV на линии без указателей

Это рекурсивная быстрая сортировка, до сих пор мне не удавалось с массивом 100000 или больше (может быть, немного меньше). Сначала я подумал, что это проблема размера памяти, но он вызывает SIGSEGV, а не переполнение стека. У меня есть итеративная версия, которая использует тот же код раздела, и тот работает нормально. Вот код...

template <typename T>
void QuicksortR(T *a, u_int l, u_int r){
    if(r <= l) return;
    u_int i  = Partition(a, l, r);
    if(i-1 < i) //in case of underflow
    QuicksortR(a, l, i - 1);
    QuicksortR(a, i + 1, r);
}

...

template <typename T>
u_int Partition(T a[], u_int l, u_int r){
    u_int i = l-1; //potential underflow fixed by an overflow
    u_int j = r;
    T v = a[r];
    while(1){
        while(a[++i] < v); //overflow fix;
        while(a[--j] > v)
            if(i == j) break;
        if(i >= j) break;
        swap(a[i], a[j]);
    }
    swap(*(a+i), *(a+r));
    return i;
}

1 ответ

но он вызывает SIGSEGV, а не переполнение стека

Никто не звонит SIGSEGV, SIGSEGV это то, что ядро выдвигает как исключение при определенных условиях. Одним из таких условий является переполнение стека, и это, вероятно, происходит здесь.

Другие вопросы по тегам