对于类,我必须递归地创建一个选择排序函数,没有循环。我终于让它编译没有错误,但现在它只是说"分段错误(核心转储)"。我对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;
}
我在这里错过了一些大事吗?
答案 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;区域然后它是段错误。