分段故障点

时间:2013-10-12 06:05:02

标签: c segmentation-fault

我正在编写用于删除相似字符的算法代码。 对于Ex。如果输入字符串是“abb”,则输出应为“a”,而“abcddbf”字符串输出应为“acf”。

我已经编写了一些如下所述的代码,但有些我如何获得Segmentation Faut并且我无法找到错误点。

代码:

#include<stdio.h>
#include<string.h>

char *remove_adjecent_string(char *in,int count)
{
int i=0;
int j=0;
int flag = 0;
int total = strlen(in);
static char *output = NULL;

if(count == 0)
{
    output=(char *)malloc(sizeof(char)*total);
    if(output == NULL)
    {
            return NULL;
    }
    for(i=0,j=0;i<=total;i++)
    {
            if(in[i] != '*')
            {
                    output[j]=in[i];
                    j++;
            }
    }
    return (char *)output;
}

for(i=0;i<=count;++i)
{ 
    printf("In loop i  :%d count :%d \t",i,count);
    printf("Before comparition in[i] = %c , in[count] = %c \t",in[i],in[count]);
    if(in[i] == in[count])
    {
            printf("Same found in[%d]  = in[%d] = %c",i,count,in[i]);
            in[i]='*';
            flag = 1;
    }
    printf(" Next loop i = %d\n",++i);
}

printf("Before Recursion \n");
output =remove_adjecent_string(in,(count-1));
return (char *)output;
}


int main()
{
  char *input;
  char *output;
  int i=0;
  input = (char *)malloc(sizeof(char)*10);
  if(input == NULL)
  {
          return;
  }
  output=(char *)malloc(sizeof(char)*10);
  if(output == NULL)
  {
          return;
  }
  input = "abbb";
  int  count = -1;
  count=strlen(input);
  output=remove_adjecent_string(input,(count-1));
  printf("Input String = %s\n",input);
  printf("Output String = %s\n",output);

}

帮助我找出有问题的案例。

3 个答案:

答案 0 :(得分:4)

    input = "abbb";

所以输入指向一个不可修改的const字符串。当你试图写信时它会被segv:

    in[i]='*';

添加:您似乎想要将“abbb”复制到输入中,所以请考虑使用strncpy()

答案 1 :(得分:0)

如何查找段错误:

  1. 将调试符号添加到可执行文件中。如果使用g ++或gcc,请将-g - 选项添加到编译器命令行。
  2. 在调试器中运行程序:gdb --args ./your-program [args]用于gdb和linux。
  3. 键入r以运行该程序。
  4. 等待段错误
  5. 键入bt以打印调用堆栈。找到代码中最顶行的行,并获取文件名和行号。
  6. 仔细看看那条线。

答案 2 :(得分:0)

我检测到的是remove_adjecent_string()返回一个包含字符串的缓冲区(名为output),但在malloc和填充此缓冲区之间,它决不会确保它是正确的null-terminated string(最后一个字符后的\0)。事实上,你甚至没有为此分配空间。

根据具体情况,这可能会导致printf()打印内存垃圾,甚至导致分段错误,因为它会在缓冲区后继续打印内存中的内容,直到最终在某处找到空字节丢失。