中止陷阱:在Mac上尝试使用quicksort运行程序时为6

时间:2016-11-12 17:00:48

标签: c gcc runtime-error

所以,我试图运行以下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;
}

1 个答案:

答案 0 :(得分:0)

逻辑错误

(a && b) != (b && a)

一般来说,对于C / C ++。当且仅当ab的评估彼此独立时,它们才相等。

在规范中,存在短路优化,因此如果a为假,则永远不会评估b。因此,如果表达式ab不是彼此独立的,则逻辑和操作不可交换

您的代码是表达式之间缺乏独立性的完美示例 - 排序很重要。

更改:

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