1

私はこの機能を持っています:

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

どうもありがとうございました。

4

5 に答える 5

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;
}
于 2012-06-09T20:58:39.100 に答える
1

trueを返す場合emptyHeapArray(h)、何も返しません。次に、コントロールは非void関数の終わりに到達しますfirstHeapArray

于 2012-06-09T20:58:11.490 に答える
1

ifコンパイラーは、テストが失敗した場合、実行できる場合はreturnステートメントがないと推測します。

于 2012-06-09T20:58:21.413 に答える
1

の場合、 IndeedfirstHeapArrayは返されませんemptyHeapArray(h) == true

これは未定義の動作です。つまり、ヒープが空のときにこの関数を使用すると、ランダムな値を受け取る可能性があります。

成功フラグを返すこのケースを処理できます。

bool firstHeapArray (IntHeapArray h, int * out_value) {
   if(!emptyHeapArray(h))
   {
       *value = h.array[0];
       return true; //success
   }
   return false;
}
于 2012-06-09T21:18:30.600 に答える
0

この関数は、次のいずれかの場合に値を返す必要があります。

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

    return 0;
}

この例では、何らかの条件が満たされた場合にのみ値を返します。

于 2012-06-09T20:59:00.770 に答える