C++ 没有指针的行上的SIGSEGV

C++ 没有指针的行上的SIGSEGV,c++,stack-overflow,segmentation-fault,C++,Stack Overflow,Segmentation Fault,这是一个递归的快速排序,到目前为止,我只对100000或更大的数组(可能更小一点)感到失望。起初我认为这是一个内存大小问题,但它调用的是SIGSEGV而不是堆栈溢出。我有一个迭代版本,它使用相同的分区代码,并且运行良好。这是我的建议 代码 模板 void QuicksortR(T*a,u_int l,u_int r){ if(rv) 如果(i==j)中断; 如果(i>=j)断裂; 掉期(a[i],a[j]); } 掉期(*(a+i),*(a+r)); 返回i; } 但它调用的是SIGSEGV而

这是一个递归的快速排序,到目前为止,我只对100000或更大的数组(可能更小一点)感到失望。起初我认为这是一个内存大小问题,但它调用的是SIGSEGV而不是堆栈溢出。我有一个迭代版本,它使用相同的分区代码,并且运行良好。这是我的建议 代码

模板
void QuicksortR(T*a,u_int l,u_int r){
if(rv)
如果(i==j)中断;
如果(i>=j)断裂;
掉期(a[i],a[j]);
}
掉期(*(a+i),*(a+r));
返回i;
}
但它调用的是SIGSEGV而不是堆栈溢出


没有人在呼叫
SIGSEGV
SIGSEGV
是内核在特定条件下作为异常引发的东西。其中一种情况是堆栈溢出,很可能发生在这里。

如果超过允许的堆栈大小,则会出现segfault。既然你的问题不符合a的要求,就不可能有权威的答案。这个问题中没有问题。
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;
}