2011-08-10 25 views
0

我似乎無法弄清楚爲什麼這不起作用,我將'aHouse'變量傳遞給返回House的函數。我對C很陌生,所以我仍然試圖讓我的頭幾個東西。設置變量爲函數的返回類型

#include <stdio.h> 

typedef struct house { 
    int id; 
    char *name; 
} House; 

House getHouse() 
{ 
    House *myHouse = NULL; 

    char c = getchar(); 
    myHouse->id = 0; 
    myHouse->name = c; /*only single char for house name*/ 

    return *myHouse 
} 

int main() 
{ 
    House *aHouse = NULL; 

    aHouse = getHouse(); 
} 
+0

這功課嗎? – MAK

+0

這段代碼有很大的麻煩:你在初始化爲NULL後不能使用myHouse指針。 –

+0

這不是家庭作業,只是我的一些代碼沒有工作的簡單抽象。 @didier啊好吧,這開始變得更有意義,謝謝。 –

回答

5

第一: 您正在使用NULL指針,並在「getHouse」功能分配值給它。這是未定義的行爲,應該會導致訪問衝突。

另外,您正在通過getHouse中的值返回一個House對象並嘗試將其指定給指針類型。指針和值是兩個不同的東西。

除非你想在堆上動態分配你的房屋,否則你根本不需要指針。

House getHouse() 
{ 
    House myHouse; 

    char c = getchar(); 
    myHouse.id = 0; 
    myHouse.name = c; /*only single char for house name*/ 

    return myHouse 
} 

int main() 
{ 
    House aHouse; 

    aHouse = getHouse(); 
} 

編輯:爲提高效率起見,你可以實現像這樣雖然:再次

void getHouse(House* h) 
{ 
    char c = getchar(); 
    h->id = 0; 
    h->name = c; /*only single char for house name*/ 
} 

int main() 
{ 
    House aHouse;  
    getHouse(&aHouse); 
} 

編輯:在房屋結構 此外,由於名稱只能是一個字符,不要不要使用char *作爲名字,只需使用char。

+0

謝謝,那正是我正在尋找的。指針開始變得更有意義。如果我的主要功能確實指向* aHouse,那麼在我退出該功能之後,House不能保證House仍然在那裏? –

+0

如果getHouse返回一個指向House類型的局部變量的指針,那麼這也是未定義的行爲,因爲局部變量將在堆棧上分配,然後在函數退出時從堆棧中釋放。如果在函數返回時需要該對象仍然有效,則需要在堆中分配它(例如,使用malloc())。指針將保持有效,直到指向的內存被釋放爲止(例如,使用free())。如果你確實在堆上分配,那麼你需要小心以後釋放內存以避免泄漏。我建議閱讀它。 – Pete