为什么在下面发生分段故障

时间:2013-02-26 17:30:08

标签: c

我正在尝试从字符串中删除两个连续的重复元素。我在第16行中遇到了分段错误。即使注释的第17行也会出现同样的错误。

不要担心我的程序逻辑。这可能是错的......但我对这个错误很感到震惊..帮助我...解释为什么我收到此错误

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char *st="fvvbbyyr";
    int i=0,j,len;
    for(len=0;st[len]!='\0';len++);
    for(i=0;i<len;i++)
    {
        if(st[i]==st[i+1])
        {
            for(j=i+2;j<len;j++)
               {
                   *(st+j-2)=*(st+j);
                   //st[j-2]=st[j];
               }
            len = len-2;
            i=-1;
        }
    }
    return 0;
}

1 个答案:

答案 0 :(得分:4)

char *st = "fvvbbyyr";

st指向匿名字符串"fvvbbyyr",它可以位于只读内存中。

*(st+j-2) = *(st+j);

尝试修改此类值会导致未定义的行为。

一个好习惯是将指针声明为const char *,因为字符串的行为就是这样。

const char *st = "fvvbbyyr";

然后你的编译器应该打印一些警告/错误。使用相当数组:

char st[] = "fvvbbyyr";

顺便说一下,数组下标运算符[]可能会使您的代码更具可读性。

st[j - 2] = st[j];

此外,您在循环中访问st[i+1] == st[len]