3

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

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 < ji != j我遇到了分段错误。当ij是指针时也会发生这种情况。为什么?

4

4 回答 4

6

几乎可以肯定是因为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检查还解决了这个问题,因为它检测到指针的相等性相互传递的指针。

于 2012-06-21T10:25:57.010 回答
3

如果 j 以奇数开始(当s字符数为偶数时),则 i 和 j 永远不会相等 - 因此循环将在数组边界之外继续s

例如,如果i = 0andj = 1在第一次评估时,那么下一个循环将有i = 1and j = 0(注意仍然不等于)并且第三个循环将有i = 2and j = -1,因此错误。

于 2012-06-21T10:25:29.710 回答
1

你是如何调用函数的?换句话说,你确定你传入的字符数组是可写的吗?

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

于 2012-06-21T10:26:10.020 回答
1

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

于 2012-06-21T10:26:56.670 回答