错误:控制可能到达非空函数的结尾

Posted

技术标签:

【中文标题】错误:控制可能到达非空函数的结尾【英文标题】:error: control may reach end of non-void function 【发布时间】:2016-10-01 19:32:39 【问题描述】:

请有人可以解释一下为什么会出现此错误:

error: control may reach end of non-void function

我正在尝试创建一个函数linearsearch() 获取一个键和一个表,如果找到则返回元素的索引。 这令人困惑;我是初学者,正在学习cs50在线课程;我以前从来没有遇到过这个错误。

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

int linearsearch(int key, int array[]);

int main(int argc , string argv[])
 
    int key = 0;
    int table[]=2,4,5,1,3;

    printf("%i is found in index %i\n",key,linearsearch(1,table));


int linearsearch(int key, int array[])

    for(int i = 0;i<5;i++)
        if(array[i] == key)
        
             return i;
            
        else
            return -1;
        
    

【问题讨论】:

这里没有从无空函数返回值的适用错误。 可能有一个(不正确的)编译器警告。代码中明显的错误在别处。 错误可能是指未从main 返回值(并且编译器处于 C99 之前的模式)。错误消息应该有一个与之关联的行号。 【参考方案1】:

在最后一个 for 循环中,无论哪种方式,您都从函数中返回了一些内容,所以应该没有任何问题(除了您的算法错误:如果没有找到它不应该立即返回)。

问题是:编译器不一定会看到您返回的数据是什么。它只是看到不会通过返回一些东西来结束你的日常工作。

大多数编译器都可以找出简单的情况,例如:

   if (x) return 0; else return 1;
  // not returning anything in the main branch but ok as it's seen as unreachable

但在您的情况下,您有一个 for 循环包装返回指令。编译器不是控制流分析器。他们做基本的事情,但肯定不是正式的执行。因此,有时他们会在您认为“正常”的情况下发出警告。

无论如何,如前所述,您的算法不正确。仅当循环结束而没有找到任何内容时,通过返回 -1 来修复它。

在这种情况下,您可以修复错误和警告。因此,您会看到警告正确地检测到代码中的可疑内容。

固定代码:

for (int i = 0; i < 5; i++)

    if (array[i] == key)
    
         // found return & exit loop
         return i;
        

// not found, end of loop: return -1
return -1;

【讨论】:

非常感谢,我明白了,我不知道我是怎么瞎了,我犯了这个错误,现在它正在起作用,你救了我的命

以上是关于错误:控制可能到达非空函数的结尾的主要内容,如果未能解决你的问题,请参考以下文章

控制到达非 void 函数的末尾是 xcode 上的错误,但不是 gcc 上的错误

C++ 函数(错误:控制可能到达非 void 函数的末尾)

Xcode 认为由于 if/else 语句中的返回,控制可能会到达非 void 函数的末尾

使用switch语句在函数中没有返回

Linux C语言编译警告:control reaches end of non-void function

warning: control reaches end of non-void function