我想制作一个反向字符串函数,我这样做了:
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
时,我遇到了分段错误。当i
和j
是指针时,也会发生这种情况。为什么呢?
答案 0 :(得分:7)
几乎可以肯定,因为i
和j
相互传递(无论它们是索引还是指针在这里都无关紧要)。例如,任何具有偶数字符的字符串都会出现此问题。
请考虑字符串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 = 0
和j = 1
,则下一个循环将包含i = 1
和j = 0
(注意仍然不相等),第三个循环将有i = 2
和j = -1
,因此错误。
答案 2 :(得分:1)
你是怎么称呼这个功能的?换句话说,你确定你传入的字符数组是可写的吗?
如果内存没问题,使用!=
时可能会崩溃,因为无法保证在您预期时会发生这种情况。
答案 3 :(得分:1)
如果strlen(s) - 1
为奇数,那么您的条件i!=j
将始终为真。