我有这段代码:
char *sort(char *string){ //shell-sort
int lnght = length(string) - 1; // length is my own function
int gap = lnght / 2;
while (gap > 0)
{
for (int i = 0; i < lnght; i++)
{
int j = i + gap;
int tmp =(int)string[j];
while (j >= gap && tmp > (int)string[j - gap])
{
string[j] = string[j - gap]; // code fails here
j -= gap;
}
string[j] = (char)tmp; // and here as well
}
if (gap == 2){
gap = 1;
}
else{
gap /= 2.2;
}
}
return string;
}
在给定序数值(ASCII值)的情况下,代码应对字符串中的字符进行排序(shell-sort)。即使代码非常简单,它仍然会在我评论的行中失败 - 分段错误。我花了很多时间使用这段代码,仍然无法找到问题。
答案 0 :(得分:6)
正如你在评论中所说,你可以这样调用我们的函数 -
char *str = "test string";
sort(str);
字符串文字位于只读内存中并为其创建指针str
,因此无法修改,并且您的函数会修改它。因此,它可能导致分段错误。
声明如下 -
char str[] = "test string";
答案 1 :(得分:2)
在这样的情况下,查看您的语句不是可执行代码,而是数学边界条件。为了便于阅读,我已将lnght
这个可怕的名称替换为length
。
以下是相对于长度输入j
循环时影响while
值的相关条件。
i < length;
gap = length / 2;
j = i + gap;
现在我们插入一个值。考虑length == 10
的情况。然后,大概数组中的最大索引为9
,这也是i
可以采用的最高值。
然后,在输入gap == 5
循环while
后,我们也会j == i + gap == 9 + 5
。显然9 + 5 > 10
。其余部分留给程序员练习。
答案 2 :(得分:1)
你如何测试你的功能?使用静态字符串(即char * buffer =“test string”;)?
因为在第一个循环中至少j和j-gap应该在字符串边界内。所以,如果你得到一个段错误,我想这是因为一个坏的字符串(静态无法修改)。
用strlen()替换length()并用一个创建良好的测试字符串调用它会导致我得到一个有效的结果: “adgfbce”→“gfedcba”