断言 - 分段错误

时间:2016-03-11 06:52:53

标签: c pointers segmentation-fault assert

我有一个我无法处理的问题,所以我想也许你可以帮助我。基本上我有一个函数接收char *作为参数并做一些东西(我检查了那些步骤/函数,它们工作得很好)。如果函数中给出的char *是“”(我猜是NULL) ),我收到断言与断言。 这是代码:

char *computeRNA(char *s)
{
    if (s != NULL && s!= "")
    {
        Lista* l = to_list(s);
        int i;
        l = l->next;
        for(i = 0; i<= lungime(l); ++i)
        {
            if(l->info == 'T')
                l->info = 'U';
            l = l->next;
        }
        char *rna = to_pointer(l);
        return rna;

    }
        return NULL;
}

以下是断言:

 char *s;
   s = computeRNA("");
    ASSERT(!strcmp(s, ""), "computeRNA-01");
    free(s);

这是学校的作业,所以我不能改变断言的代码,只能改变功能。提前致谢!

2 个答案:

答案 0 :(得分:0)

您不能将NULL指针作为参数传递给strcmp()。在ASSERT语句之前,只需检查s的非NULL值。像

这样的东西
if (s) {
  ASSERT(!strcmp(s, ""), "computeRNA-01");
 }

应该做的。

编辑:

如果使用更改函数,断言也是不可能的,您可以修改computeRNA()函数以返回空字符串,而不是NULL,如

char * empty_string = calloc(1,1);
return empty_string;

以后可以传递给来电者的free()

答案 1 :(得分:0)

这个ASSERT你不应该改变,测试如果给computeRNA一个空字符串,它也应该返回一个空字符串:

s = computeRNA("");
ASSERT(!strcmp(s, ""), "computeRNA-01");

您的代码返回空指针。另外,需要使用strcmp来比较字符串,s == ""只会比较在这里不会使用的指针值。

因此我用

开始这个功能
// null pointer was given
if (!s) {
    return calloc(1, 1);
}

// an empty string was given (the first character pointed to b s is the string terminator.)
// to compare explicitly, you need to do `strcmp(s, "")` == 0. `s == ""` is wrong.
if (!*s) {
    return "";
}