“警告:控制到达非void函数的结尾”但实际上该函数被声明为int并返回一个int

我有这个function:

int firstHeapArray (IntHeapArray h) { if(!emptyHeapArray(h)) return h.array[0]; } 

它被声明为int,这是IntHeapArray结构:

 typedef struct intHeapArray { int *array; int size; } IntHeapArray; 

你能说出为什么我在编译时会收到这个警告吗?

 heap-test.c: In function 'firstHeapArray': heap.h:31:1: warning: control reaches end of non-void function 

非常感谢你。

错误消息表明您有一个不是返回void的方法,但是您在没有返回值的情况下到达了最后。 您需要返回有效的int值。

问题出在这里:

 int firstHeapArray (IntHeapArray h) { if(!emptyHeapArray(h)) return h.array[0]; // If emptyHeapArray(h) is true, you reach here... // You need to return SOMETHING here to remove the warning return 0; } 

如果emptyHeapArray(h)返回true,则不返回任何内容。 然后控件到达非void函数firstHeapArray

编译器推断,当if测试失败时,如果可以执行则没有return语句。

实际上,如果emptyHeapArray(h) == true firstHeapArray不会返回。

这是未定义的行为,这意味着任何事情都可能发生,很可能是当堆为空时使用此函数的任何人都可能会收到一个随机值。

您可以处理此情况返回成功标志:

 bool firstHeapArray (IntHeapArray h, int * out_value) { if(!emptyHeapArray(h)) { *value = h.array[0]; return true; //success } return false; } 

在任何一种情况下,此函数必须返回值:

 int firstHeapArray (IntHeapArray h) { if(!emptyHeapArray(h)) return h.array[0]; return 0; } 

在您的示例中,仅在满足某些条件时才返回值。