“并非所有控制路径都在函数中返回值”

时间:2014-01-04 19:38:11

标签: c return-value

正如标题所说,我想要使用的功能会收到此警告。我希望我的函数能够找到结构的地址,其中.d值等于或小于给函数distance的那个,其字符串字段与“较小”相比较给定的字符串。 (由于其他因素,没有重复,所以> =相当于>)。

我很确定每一个if和else都有他们的回报(除非我是盲目的),而我根本不知道还有什么可能导致这个警告。

该功能正在查看的结构:

typedef struct Fixer_t SpelChk_En;
struct Fixer_t
{
    char *word;
    int d;
    SpelChk_En *next;
};

功能:

/*
| Function: FindSpelPlace
| Action: Finds where to wedge the new entry
| Input: Speller first struct, distance and the word
| Returns: Address of the previous entry
*/
SpelChk_En *FindSpelPlace( SpelChk_En *speller , char *str , int distance )
{
    if( speller->d < distance )
    {
        if( speller->next->d < distance )
            return FindSpelPlace( speller->next , str, distance );
        else if( speller->next->d > distance )
            return speller;
        else
        {
            if( strcmp(speller->next->word , str ) > 0 )
                return speller;
            else
                return FindSpelPlace( speller->next , str , distance );
        }
    }
    else if( speller->d == distance )
    {
        if( strcmp( speller->word , str ) < 0 )
        {
            if( strcmp( speller->next->word , str ) < 0 )
                return FindSpelPlace( speller->next , str , distance );
            else
                return speller;
        }
        else
            return speller;
    }
    else
    {
        //this can happen only with the first speller
        return NULL;
    }
    //This turned out far bigger than I figured it would be...
}

1 个答案:

答案 0 :(得分:1)

添加

return NULL;

作为函数的最后一个语句。


或修改功能只有一个出口点:

SpelChk_En *FindSpelPlace(SpelChk_En *speller, char *str, int distance)
{
  SpelChk_En * result = NULL;

  if (speller->d < distance)
  {
    if (speller->next->d < distance)
      result = FindSpelPlace(speller->next, str, distance);
    else if (speller->next->d > distance)
      result = speller;
    else
    {
      if (strcmp(speller->next->word, str) > 0)
        result = speller;
      else
        result = FindSpelPlace(speller->next, str, distance);
    }
  }
  else if (speller->d == distance)
  {
    if (strcmp(speller->word, str) < 0)
    {
      if (strcmp(speller->next->word, str) < 0)
        result = FindSpelPlace(speller->next, str, distance);
      else
        result = speller;
    }
    else
      result = speller;
  }

  return result;
}

这样代码就是

  • 更有条理
  • 更容易理解
  • 更好地维护
  • 不易出错

一句话:“更好”