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

时间:2012-06-09 20:57:17

标签: c gcc

我有这个功能:

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

非常感谢。

5 个答案:

答案 0 :(得分:5)

错误消息指出您有一个不是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;
}

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

如果firstHeapArrayemptyHeapArray(h) == true确实不会返回。

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

您可以处理此案例,返回成功标志:

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

答案 4 :(得分:0)

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

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

    return 0;
}

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