所以,我试图运行以下C程序,而我在运行它时得到的只是一个错误:
中止陷阱:6
任何想法为什么?这只发生在运行quicksort算法时。我认为这与递归有关,但它应该可以正常工作,所以我不知道发生了什么。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_DIM 30
int partition(char**, int, int);
void quickSort(char**, int, int);
int main()
{
char **array;
array = (char**) malloc(6*sizeof(char*));
for(int i = 0; i < 6; i++)
{
array[i] = (char*) malloc(MAX_DIM*sizeof(char));
}
strcpy(array[0], "ok");
strcpy(array[1], "bye");
strcpy(array[2], "then");
strcpy(array[3], "yeah");
strcpy(array[4], "lets");
strcpy(array[5], "go");
quickSort(array, 0, 5);
for(int i = 0; i < 6; i++)
{
printf("%s\n", array[i]);
}
return 0;
}
void quickSort(char **a, int l, int r)
{
int j;
if( l < r )
{
j = partition( a, l, r);
quickSort( a, l, j-1);
quickSort( a, j+1, r);
}
}
int partition(char **a, int l, int r) {
int i, j;
char pivot[MAX_DIM], t[MAX_DIM];
strcpy(pivot, a[l]);
i = l; j = r+1;
while(1)
{
do ++i; while( strcmp(a[i], pivot) <= 0 && i <= r );
do --j; while( strcmp(a[j],pivot) > 0);
if( i >= j ) break;
strcpy(t, a[i]); strcpy(a[i], a[j]); strcpy(a[j], t);
}
strcpy(t, a[l]); strcpy(a[l], a[j]); strcpy(a[j], t);
return j;
}
答案 0 :(得分:0)
(a && b) != (b && a)
一般来说,对于C / C ++。当且仅当a
和b
的评估彼此独立时,它们才相等。
在规范中,存在短路优化,因此如果a
为假,则永远不会评估b
。因此,如果表达式a
和b
不是彼此独立的,则逻辑和操作不可交换。
您的代码是表达式之间缺乏独立性的完美示例 - 排序很重要。
更改:强>
do ++i; while( strcmp(a[i], pivot) <= 0 && i <= r );
要强>
do ++i; while( i <= r && strcmp(a[i], pivot) <= 0 );
<强>输出:强>
bye
go
lets
ok
then
yeah