为什么下面的冒泡排序代码会给出分段错误?

时间:2018-02-20 12:50:21

标签: c c-strings

#include<stdio.h>
#include<string.h>
int main(){
    char *a[]={"this","is","a","string"};
    char temp[100];
    for(int i=0;i<3;i++){                               
        for(int j=0;j<3-i;j++){
            if(strcmp(a[j],a[j+1])>0){
                strcpy(temp,a[j]);
                strcpy(a[j],a[j+1]);
                strcpy(a[j+1],temp);
            }
        }
    }
    for(int i=0;i<4;i++){
        printf("%s\n",a[i]);
    }
}

以下代码用于对字符串进行冒泡排序。它给出了分段错误。它有什么问题?

2 个答案:

答案 0 :(得分:3)

字符串文字在C中是只读的。您的strcpy(a[j],a[j+1])strcpy(a[j+1], temp)电话是非法的。

答案 1 :(得分:3)

无需使用strcpy。您唯一需要做的就是交换a[j]a[j+1]指针

确保for循环具有正确的边界。数组的大小为4,有效元素的范围为[0..4)

看看以下内容:

int main(){
        char const *a[]={"this","is","a","string"}; //const added
        char *temp = 0; // a simple pointer
        for(int i=0;i<4;i++){     //bounds changed                          
                for(int j=0;j<4-1;j++){
                        if(strcmp(a[j],a[j+1])>0){ // swap pointers
                            temp = a[j];
                            a[j] = a[j+1];
                            a[j+1]=temp;
                        }
                }
        }
        for(int i=0;i<4;i++){
                printf("%s\n",a[i]);
        }
}