为什么这个反向字符串函数会产生seg错误?

时间:2012-06-21 10:22:52

标签: c string segmentation-fault reverse

我想制作一个反向字符串函数,我这样做了:

void reverse_str(char s[])  {
    int i, j;
    char ch;
    for(i = 0, j = strlen(s) - 1; i < j; i++, j--)  {
        ch = s[i];
        s[i] = s[j];
        s[j] = ch;
    }
    return ;
}

但由于某种原因,当我将i < j更改为i != j时,我遇到了分段错误。当ij是指针时,也会发生这种情况。为什么呢?

4 个答案:

答案 0 :(得分:7)

几乎可以肯定,因为ij相互传递(无论它们是索引还是指针在这里都无关紧要)。例如,任何具有偶数字符的字符串都会出现此问题。

请考虑字符串drum的以下序列:

     0123 <- indexes
     ----
s = "drum", i = 0, j =  3, swap d and m.
s = "mrud", i = 1, j =  2, swap r and u.
s = "murd", i = 2, j =  1, swap u and r, oops, we've passed each other.
s = "mrud", i = 3, j =  0, swap m and d.
s = "drum", i = 4, j = -1, swap who knows what, undefined behaviour.

请注意,对于具有奇数长度的字符串,您将不会遇到此问题,因为i最终等于j(在中间字符处)。

i < j检查还修复了这个问题,因为它检测到指针指针的相等性。

答案 1 :(得分:3)

如果j以奇数开始(当s具有偶数个字符时),则i和j将永远不会相等 - 因此循环将继续超出数组s的范围。< / p>

例如,如果首次评估i = 0j = 1,则下一个循环将包含i = 1j = 0(注意仍然不相等),第三个循环将有i = 2j = -1,因此错误。

答案 2 :(得分:1)

你是怎么称呼这个功能的?换句话说,你确定你传入的字符数组是可写的吗?

如果内存没问题,使用!=时可能会崩溃,因为无法保证在您预期时会发生这种情况。

答案 3 :(得分:1)

如果strlen(s) - 1为奇数,那么您的条件i!=j将始终为真。