C Bus错误:10使用字符串数组

时间:2017-10-03 13:11:10

标签: c arrays pointers quicksort bus-error

我在C中编写了一个快速排序算法,我在终端上不断获得bus error:10。我知道我需要为数组分配内存,尽管在这种特定情况下我不确定如何。

修改:我添加了quicksortpartitioningswap函数

void swap(char* a, char* b){

int temp = *a;
*a = *b;
*b = temp;
}

int partitioning(char* A, int start, int finish){

    char* pivot = &A[start];

    while(1){

        while(strcmp(&A[start], pivot) < 0){
            start++;
        }
        while(strcmp(&A[finish], pivot) > 0){
            printf("Decrementing finish\n");
            finish--;
        }
        if(start >= finish){

            return start;
        }
        swap(&A[start], &A[finish]);
    }
    return start;
}

void quicksort(char* A, int start, int finish){


if(start < finish){

    int p = partitioning(A, start, finish);
    quicksort(A, start, p);
    quicksort(A, p+1, finish);
    }
}
int main()
{
    char *A[] ={"Thomas","Carl","Sabrina","Noam","Alex",
                "Victoria","Julia","Audrey","Elon","Liam","Rebecca"};
    int n = 11;
    for (int i = 0; i < 11; i++)
    {
        printf("%s ", A[i]);
    }

    quicksort(*A, 0 , n-1);

    printf("\n-------\n after sort\n------\n");
    for (int i = 0; i < 11; i++)
    {
        printf("%s ", A[i]);
    }   
    printf("\n");
    return 0;
}

2 个答案:

答案 0 :(得分:0)

如果没有更多信息,您可以在将A解除引用后将其quicksort()传递给quicksort(A[0], 0, n - 1); ,这样您就会丢失信息。

事实上,这个电话相当于

quicksort()

取决于quicksort(A[0], 0, n - 1)实际正在做什么, SIGBUS 的原因必须在其中,但您没有发布它。不过你的问题显然是指针。看起来你并不太了解它们。

由于AA[0]的地址相同,我没有断言const因前一段中表达的问题而导致问题的原因是不同之处在于在两者上执行的指针算术,这取决于不同的指针类型。

另外,在使用字符串文字时不要修改它们应该小心,因为它是未定义的行为,防止意外操作的一种方法是使用这样的const char *A[] = { ... /* String Literals Here */ ... };

wait

答案 1 :(得分:0)

主要问题是您尝试对A[0]而不是A进行排序。以下修改后的代码有效:

#include <stdio.h>
#include <string.h>

void swap(char** a, char** b){

    char* temp = *a;
    *a = *b;
    *b = temp;
}

int partitioning(char** A, int start, int finish){

    int pivot = start;

    while(1){

        while(strcmp(A[start], A[pivot]) < 0){
            start++;
        }
        while(strcmp(A[finish], A[pivot]) > 0){
            finish--;
        }
        if(start >= finish){

            return start;
        }
        swap(&A[start], &A[finish]);
    }
    return start;
}

void quicksort(char** A, int start, int finish){

    if(start < finish){

        int p = partitioning(A, start, finish);
        quicksort(A, start, p);
        quicksort(A, p+1, finish);
    }
}

int main()
{
    char *A[] ={"Thomas","Carl","Sabrina","Noam","Alex",
                "Victoria","Julia","Audrey","Elon","Liam","Rebecca"};
    int n = sizeof(A) / sizeof(A[0]);
    for (int i = 0; i < n; i++)
    {
        printf("%s ", A[i]);
    }

    quicksort(A, 0 , n-1);

    printf("\n-------\n after sort\n------\n");
    for (int i = 0; i < n; i++)
    {
        printf("%s ", A[i]);
    }   
    printf("\n");
    return 0;
}