【问题标题】:Why segmentation fault occurs in the following [duplicate]为什么会出现以下分段错误[重复]
【发布时间】:2013-02-27 01:34:01
【问题描述】:

我正在尝试从字符串中删除两个连续的重复元素。我在第 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;
}

【问题讨论】:

  • 您没有使用编译器警告。在转向 SO 之前,请务必用尽本地可用的工具。
  • @Pascal Cuoq 它是上面提到的一个副本...

标签: c


【解决方案1】:
char *st = "fvvbbyyr";

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

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

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

一个好习惯是将指针声明为const char *,因为字符串litteral 以这种方式运行。

const char *st = "fvvbbyyr";

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

char st[] = "fvvbbyyr";

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

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

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

【讨论】:

  • 感谢您的解释......现在错误没有发生......谢谢
猜你喜欢
  • 1970-01-01
  • 2011-04-23
相关资源
最近更新 更多