“警告:控制到达非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; }
在您的示例中,仅在满足某些条件时才返回值。