小功能上的分段故障

时间:2016-03-08 17:14:50

标签: c sorting segmentation-fault

我一直在这个问题上遇到分段错误,有人看到原因吗?

void str_sort(char s[]) {
    int i, j;
    char c;

    for (i = strlen(s) - 1; i > 0; i--)
        for (j = 0; j < i; j++)
            if (*(s+j) > *(s+j+1)) {
                c = *(s+j);
                *(s+j) = *(s+j+1);
                *(s+j+1) = c;
            }
    return;
}

2 个答案:

答案 0 :(得分:2)

字符串文字存储在不允许修改的内存区域中。如果你创建一个数组来存储字符串,它应该工作正常(假设你的函数是正确的,它看起来像乍一看):

int main()
{
    char str[] = "PC-spiel";
    str_sort(str);
    return 0;
}

差异是像"PC-spiel"这样的字符串文字是指向不可修改常量的指针。但是字符串str像普通数组/变量一样位于堆栈中,并在运行时将值"PC-spiel"复制到其中。

答案 1 :(得分:0)

您的字符串排序功能就位。它将修改其字符串参数。你用字符串文字调用它,试图修改参数将调用未定义的行为。如果字符串文字已经被排序,例如"abc",那么没有问题,因为没有执行写访问,但是如果你调用str_sort("ba");未定义的行为接着而且崩溃是一种可能的未定义行为形式。

请注意,您应该使用索引表示法以获得更好的可读性,而最终return;则无用:

void str_sort(char s[]) {
    int i, j;
    char c;

    for (i = strlen(s) - 1; i > 0; i--) {
        for (j = 0; j < i; j++) {
            if (s[j] > s[j+1]) {
                c = s[j];
                s[j] = s[j+1];
                s[j+1] = c;
            }
        }
    }
}