【问题标题】:Why is this reverse string function giving a seg fault?为什么这个反向字符串函数会出现段错误?
【发布时间】:2024-04-23 05:35:01
【问题描述】:

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

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

【问题讨论】:

    标签: c string segmentation-fault reverse


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果 j 以奇数开头(当 s 有偶数个字符时),那么 i 和 j 永远不会相等 - 因此循环将在数组 s 的边界之外继续。

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            最近更新 更多