【问题标题】:I'm getting Runtime Error : Segmentation Fault (SIGSEGV), why?我收到运行时错误:分段错误 (SIGSEGV),为什么?
【发布时间】:2017-07-26 23:56:15
【问题描述】:

我在这方面遇到了运行时错误,我似乎无法弄清楚。 这是我的代码,用于反转字符串并将 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);
}

【问题讨论】:

  • str=reverse(input); 正在泄漏内存。
  • 进行了必要的更改,但我仍然遇到同样的错误。
  • 我试试你的程序,它对我有用。只需在调用 reverse 之前将最后一个 printf 更改为 printf("%s\n", str);input = "ATGC" 即可。它可以正常工作并打印 CGAT。
  • 在函数中:main(),数组str[]正在设置,但从未使用过。

标签: c


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    其次,你不需要为str分配内存,因为你是在函数中分配的。

    并且您应该为函数中的另外一个字符分配内存,因为'\0' 需要。

    【讨论】:

    • 为什么for循环应该是无限的?从 len-1 ... 0 倒数就可以了
    • 他有它++ 而不是--。现在必须编辑它。
    • 啊,我错过了那个修复。那你当然是对的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 2017-10-20
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多