C 使用指针数组对一个列表进行两次排序

C 使用指针数组对一个列表进行两次排序,c,arrays,string,pointers,C,Arrays,String,Pointers,我试图通过使用指针来查看排序。数据的原始顺序,以及通过指针数组访问的字母顺序。但这是错误的。第一次打印显示按字母顺序排列。没有。我回顾了适合我的插入排序算法。我的错在哪里?谢谢你的回答 #include <stdio.h> #include <string.h> #define MAX 3 void ins_sort(char *x_ptr[], int size); int main(){ char x[MAX][20]; char *x_p

我试图通过使用指针来查看排序。数据的原始顺序,以及通过指针数组访问的字母顺序。但这是错误的。第一次打印显示按字母顺序排列。没有。我回顾了适合我的插入排序算法。我的错在哪里?谢谢你的回答

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

#define MAX 3

void ins_sort(char *x_ptr[], int size);

int main(){   
    char x[MAX][20];
    char *x_ptr[MAX];
    int i;

    for(i=0 ; i < MAX ; i++){   
        scanf("%s" ,x[i]);
        x_ptr[i] = x[i];
    }

    ins_sort(x_ptr, MAX);

    printf("\n\n");
    for(i=0 ; i < MAX ; i++)
        printf("%s\n", x_ptr[i]);

    printf("\n\n");
    for(i=0 ; i < MAX ; i++)
        printf("%s\n", x[i]);

    return 0;
}

void ins_sort(char *x_ptr[], int size){
    int i,j;
    char *temp;

    for(i=1 ; i < size ; i++){
        temp = x_ptr[i];

        for(j=i ; j >= 0 && strcmp(temp, x_ptr[j-1]) < 0 ; j--){
            x_ptr[j] = x_ptr[j-1];
        }

        x_ptr[j] = temp;
    }
}
您的错误如下:

    for(j=i ; j > 0 && strcmp(temp, x_ptr[j-1]) < 0 ; j--){   /* >= must be > or j-1 = -1 */
例如:

很明显,通过gdb运行代码时,您正在执行与x_ptr[-1]的比较,这导致您在离开函数时陷入未定义的行为和segfault(如果不是彻底崩溃):

39              for(j=i ; j >= 0 && strcmp(temp, x_ptr[j-1]) < 0 ; j--){
(gdb) info locals
i = 1
j = 0
@娜塔莎杜塔
$ ./bin/ptrsort

 enter x_ptr[0] : bac

 enter x_ptr[1] : cab

 enter x_ptr[2] : abc


abc
bac
cab


bac
cab
abc
39              for(j=i ; j >= 0 && strcmp(temp, x_ptr[j-1]) < 0 ; j--){
(gdb) info locals
i = 1
j = 0