2011-08-10 20 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 ahh okこれはもっと感謝し始めます、ありがとう。 –

答えて

5

まず: あなたはNULLポインタを使用し、「getHouse」関数でそれに値を割り当てています。これは未定義の動作であり、アクセス違反が発生するはずです。

また、getHouseからHouseオブジェクトを値で返し、ポインタ型に割り当てようとしています。ポインタと値は2つの異なるものです。

住宅をヒープに動的に割り当てる必要がなければ、ここにポインタは必要ありません。

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(); 
} 

EDIT:名前が1つの文字、ドンすることができるので、家の構造でも :再び

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); 
} 

はEDIT:効率のために、あなたはこのかかわらず、同じようにそれを実装することができ名前にchar *を使用するのではなく、単にcharを使用します。

+0

ありがとう、それはまさに私が探していたものでした。ポインタがより意味をなさないようになっています。私の主な機能が* aHouseを指していたなら、私がその機能を終了した後にまだ家がそこにいるという保証はありませんか? –

+0

getHouseがHouse型のローカル変数へのポインタを返した場合、ローカル変数がスタックに割り当てられ、関数が終了するとスタックから割り当てが解除されるため、これも未定義の動作です。関数が復帰したときにオブジェクトが有効である必要がある場合は、ヒープ内にオブジェクトを割り当てる必要があります(例:malloc())。ポインタは、それが指し示すメモリが解放されるまで(例えばfree()で)有効なままである。ヒープに割り当てる場合は、後でメモリを解放してリークを避ける必要があります。私はそれを読むことをお勧めします。 – Pete

関連する問題