2012-01-16 19 views
2

私はCの新作ですので、間違いを修正してください。C構造体の割り当て?

ここでのソートの私は

//typdef stuff for apple, *apple_t here 
apple_t get() { 
    apple a; 
    a.num = 0; 

    apple_t ap = &a; 
    printf("set num to %d\n", ap->num); 
    return ap; 
} 

// ap above is placed into read(ap) 
void read(apple_t ap) { 
    printf("num: %d\n", ap->num); 
} 

なぜそれが「設定」プリントAP-> NUM == 0のためということですが、私は、読み取り機能 でのprintfを行うときに持っているコードのようなものだいくつかのコードがあります私は-1218550893のようないくつかの迷惑電話番号を取得しますか?どうしたの?整数セットは解放されていますか? Cは何をしていますか?そしてこれをどのように修正しますか?

+6

Cでよく知られている間違いであるローカル変数*のアドレスを返しています。 – Jon

+0

あなたのコードには[ダングリングポインタ]があります(http://stackoverflow.com/questions/5278859/c-dangling -pointer-question)。 –

+0

[ローカル変数のメモリをそのスコープ外にアクセスできるかどうか]の複製が可能ですか?(http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope) – Jon

答えて

9

ローカル変数のアドレスを返します。

この場合、変数aはローカル変数です。関数が終了すると失われます。値によって

  1. 戻り、それを:

    は、この問題を解決するには、2つのオプションがあります。その住所を返さないでください。

  2. malloc()を使用してメモリを割り当てます。しかし、あとでfree()にしてください。
+0

私はいつもこれをやっていたプログラマーと一緒に仕事をしていました。彼の議論は、それが99%の時間を過ごしたということでした! –

+0

いいえ、 'ap'はローカル変数' a'のアドレスを保持しています。 –

+0

@JeffMercado Ahhhh、あなたは正しい...固定。 – Mysticial

0

ローカル変数を返していますが、関数が返された後は使用できません。

Cは、構造体を返すことができ、そうではすべてのポインタの必要は:

apple_t get() { 
    apple_t a; 
    a.num = 0; 
    return a; 
} 

次のコードは、ローカル変数を返さない、結果をコピーしません。

関連する問題