2016-03-22 24 views
-1

ポインタ変数がCで宣言されているときに割り当てられるメモリとmallocを使って割り当てられるメモリの主な違いは何ですか?Cでの動的メモリ割り当て

+5

生涯。自動オブジェクトの存続期間は、宣言されたブロックが終了すると終了します。割り当てられたオブジェクトの有効期間は、割り当てが解除される(またはプログラムが終了する)ときに終了します。 – EOF

+0

@EOFまた、ロダータなどのためにローダーによって割り当てられたスペースもあります。 –

+0

... Immaがこれを「あまりにも広すぎる」と閉鎖している理由です。 –

答えて

1

オブジェクトへのポインタを返すことをお勧めします。

foo *newFoo1(void) 
{ 
    foo *ptr = malloc(sizeof (struct foo)); 
    ptr -> bar = 42; 
    return ptr; 
} 

newFoo1()ヒープへのメモリのブロックを割り当て:新しいfooオブジェクトを作成するために、malloc()を使用し

struct foo 
{ 
    int bar; 
} 

:たとえば

は、我々は構造体がfooと呼ばれる持っていると言いますptrと入力し、すべての初期化が行われます。最後にptrが返されます。 newFoo()が返された後、*ptrの寿命はオーバーライドされないヒープ上に存在するため、終了しません。

そうでない場合、あなたは、単にローカル変数へのポインタを返すことがあります。この場合

foo *newFoo2(void) 
{ 
    foo aFoo; 
    aFoo.bar = 42; 
    return &aFoo; 
} 

aFooスタック上に存在します。 newFoo2()が返された場合、aFooの有効期間は直ちに終了します。対応するメモリはすぐに上書きすることはできませんが、すべての情報aFooは、1つ以上の関数が呼び出された後に最終的に失われます。

関連する問題