我一直在这个问题上遇到分段错误,有人看到原因吗?
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;
}
答案 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;
}
}
}
}