使用Selection排序递归函数的分段错误

时间:2015-10-22 07:34:57

标签: c function debugging pointers recursion

对于类,我必须递归地创建一个选择排序函数,没有循环。我终于让它编译没有错误,但现在它只是说"分段错误(核心转储)"。我对C很陌生,所以请解释一下这意味着什么。我假设堆栈溢出,但我不知道在哪里或如何。

以下是Selection Sort中涉及的两个函数。

void CheckRemaining(int arr[], int minpos, int len, int j) {
    if (j == len - 1) {
        return;
    }

    if (arr[minpos] > arr[j]) {
        minpos = j;
    }

    CheckRemaining(arr, minpos,len, j + 1); //j increments with each iteration
}

void SelectionSort(int arr[], int len) {
    int i = 0;
    int j;
    int minpos;

    minpos = i;
    if (i == len - 2) {
        return;
    } else {
        j = i;
        CheckRemaining(arr, minpos,len, j);
        swap(&arr[minpos], &arr[j]);

        SelectionSort(&arr[i++], len); //The location in the array increments
    }
}

int main() {
    int i;
    int len;

    int arr[] = {5,7,3,2,9,4,10};
    len = sizeof(arr)/sizeof(arr[0]);

    SelectionSort(arr,len);

    for ( i = 0; i < len; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}

我在这里错过了一些大事吗?

4 个答案:

答案 0 :(得分:0)

您最有可能是堆栈溢出,因为递归永远不会结束。

问题是您在条件中使用局部变量i来终止递归,但是您忘记了每个调用的局部变量都是本地变量。每次调用SelectionSort时,都会有一个新的i变量初始化为零,因此递归永远不会结束。

答案 1 :(得分:0)

SelectionSort(&arr[i++], len);

我认为,它不应该适用于此代码。递归永远不会结束。每当您致电 SelectionSort() 并使用0初始化 i 时, 永远不会 len-2 。每次此功能获得不同的 i

答案 2 :(得分:0)

int i=0;

您将i定义为局部范围变量,意味着每次调用时,i = 0都会生效,从而使您无法获得大于0的任何i,因此这个条件:

if (i==len-2)

永远不会成真。因此,你得到一个无限循环。

答案 3 :(得分:0)

顺便说一句,为了回答你关于段错的问题,当你遇到分段错误时,就意味着你想要达到一个禁止的#34;记忆区域,例如(开头的常见错误),当你没有选择字符串/标签时,你的循环索引是&#34;太远&#34;你想访问一个禁止的&#34;禁止&#34;区域然后它是段错误。