我收到运行时错误:分段错误(SIGSEGV),为什么?

时间:2017-07-26 14:05:16

标签: c

我在这里遇到了运行时错误,我似乎无法弄明白。 这是我的代码,用于反转字符串并将A更改为T,反之亦然,将C更改为G,反之亦然,

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

char* reverse(char *input)
{
    int len=strlen(input);
    char *rev=NULL;
    rev=(char*)malloc(sizeof(char)*len);
    int i,k=0;
    for(i=len-1;i>=0;i--)
    {
        rev[k++]=input[i];
        if(rev[k-1]=='A')
            rev[k-1]='T';
        else if(rev[k-1]=='T')
            rev[k-1]='A';
        else if(rev[k-1]=='C')
            rev[k-1]='G';
        else if(rev[k-1]=='G')
            rev[k-1]='C';
    }
    rev[k]='\0';
    return rev;
}

int main()
{
    char *input=(char *)malloc(sizeof(char)*1000);
    scanf("%s",input);
    char *str =NULL;//(char*)malloc(sizeof(char)*1000);
    str=reverse(input);
    printf("%s",input);
     free(input);
}

2 个答案:

答案 0 :(得分:4)

您没有分配足够的内存来保存反向字符串:

int len=strlen(input);
...
rev=(char*)malloc(sizeof(char)*len);
...
rev[k]='\0';

您为终止\0错过了1个额外字节。

顺便说一句......请不要将malloc的返回值强制转换为指针。

答案 1 :(得分:1)

首先,您在for循环中使用i++而不是i--。这意味着for循环永远不会结束,而k会变得非常大,而rev[k]会尝试访问它不应该的值。

其次,您不需要为str分配内存,因为您在函数中分配了内存。

如果对于'\0',你应该为函数中的一个char分配内存。