2013-05-30 165 views
2

這是我第一次問這裏。 我只是想知道這段代碼的「返回」是否正確,特別是第一個。返回指針C

tVideo* getVideo(int id, tTblVideo* table){ 
    tVideo* videoFound = NULL; 
    int i; 
    for(i = 0; i < table->length; i++){ 
     if(table->data[i]->mediaID == id) return *table->data[i]; 
    } 
    return videoFound; 
} 

編輯:添加tTblVideo定義:

typedef struct { 
    /* Number of stored files */ 
    int length; 

    /* Array of video files */ 
    tVideo *data; 

} tTblVideo; 
+2

沒有辦法知道沒有看到'tTblVideo'。它是否編譯? – jxh

+3

第二個返回總是給出NULL,因爲什麼都沒有設置videoFound。也就是說,提前退出是要走的路,所以這不是一個真正的問題。這只是一個不必要的變量。 – ams

+0

好的做法是用'videoFound = table-> data [i]'替換'return * table-> data [i]'。 –

回答

3

從該行代碼:

if(table->data[i]->mediaID == id) return *table->data[i]; 

這表明table->data[i]預計是一個指向結構與mediaID構件。然而,return語句是解引用此指針,這意味着它將返回一個結構對象,而不是指向結構的指針。在此基礎上,我會說你不應該取消引用值到return

if(table->data[i]->mediaID == id) return table->data[i]; 

但是,你typedeftTblVideo表明data成員是一個指向tVideo。你的函數不會編譯。最少的修正是使用正確的結構成員訪問操作符,並返回找到的元素的地址。

if(table->data[i].mediaID == id) return &table->data[i]; 
+0

你說得對。我已經添加了tTblVideo的定義,正如你所看到的,數據也是一個指針,所以在這種情況下它會是正確的? – tomacco

+0

這倒退了! – ams

+0

@ams:你是什麼意思? – jxh

1

table->datatVideo*類型,因此table->data[i]tVideo類型。要返回一個指向你需要的數組項取地址條目

if(table->data[i].mediaID == id) return &table->data[i]; 
+0

不完全。還需要'table-> data [i] .mediaID == id'。 – jxh

+0

@ user315052:編輯,謝謝。 – ams