2016-05-31 9 views
4

私は現在C言語を学んでいますが、私はポインタとmalloc()関数の頭を包み込むのに苦労しています。ポインタとmallocを理解する

:私はこのコード例では理解するのに苦労し、いくつかのものがあります

char name[80]; 
fgets(name, 80, stdin); 
island *p_island0 = create(name); 

island* create(char *name) { 
    island *i = malloc(sizeof(island)); 
    i->name = strdup(name); 
    i->opens = "09:00"; 
    i->closes = "17:00"; 
    i->next = NULL; 
    return i; 
} 

次にこのように呼ばれています:私の本の例では、私は次の関数が定義されていそう

  1. に割り当てられた変数は0123に割り当てられますは、HEAPに割り当てられた新しいメモリ空間の参照を一時的に保存するだけですか?

  2. island *p_island0 = create(name);の後、最終的にp_island0に格納されているものはありますか? malloc()によって作成されたアドレス、または別のポインタが作成され、前のi変数の値がp_island0 ...にコピーされました。 malloc関数に割り当てられたとき、私の変数に起こる何

答えて

1

1.(はsizeof(島));,それだけで一時的にヒープ上に割り当てられた新しいメモリ空間の参照が格納されていますか?

i店舗malloc()によって返されたポインタ。その後、関数の戻り値として返されます。動的メモリの寿命はプログラムの実行時間と同じです(手動で割り当て解除しない限りfree())ので、ポインタが指すメモリ領域に格納された値は有効で、関数が復帰した後にアクセス可能です。

FWIW、ここで注意すべき点は、malloc()の戻り値を使用する前に、それが失敗した場合にmalloc() UBを避けるためにNULLに対して返された値をチェックすることは常に良いことです。 p_island0に格納され、最終的にどのような島*p_island0 = create(name);、後

2.? malloc()によって作成されたアドレス、または別のポインタが作成され、前のi変数の値がp_island0にコピーされましたか?

malloc()によって返された同じポインタが返されます。あなたはiに保存されているreturn i;ポインタ値がは、呼び出し元の関数に変数p_island0をコピーし、その後、iされない

+1

ありがとうございましたSouravのことがより明確になっています... – BlackSwing

1

は、スコープの外に出ます。割り当てられたメモリはスコープから外れることはありません。プログラム全体の有効期間があります。またはfreeをポインタ値で呼び出すまでです。どの変数がポインタ値を格納しているかは、malloc呼び出しによって返された元のポインタ値であれば問題ありません。

どのように関数によって返される値がC仕様で指定されていないかは、コンパイラ、オペレーティングシステム、および基礎となるハードウェアによって異なります。ほとんどの場合、スタックは関与していませんが、戻り値はCPUレジスタに格納されます。

+0

"* pointer *"を読み込むために "* pointer *"を拡張していますか?それは "*コピー*"についてです。 – alk

1
  1. mallocは、割り当てられたメモリブロックのアドレスを、一般的なポインタ型で、アドレス(他の値と同じ)がiにコピーされているものとして返します。
  2. mallocから返されたアドレスがp_island0に格納されています。 * mallocから返されたアドレスはヒープメモリへのもので、割り当てられたメモリは 'フリー'関数が呼び出されるまで、またはプログラムが終了するまで存続します。
0

はおそらく構造体です。

機能(文字*名)を作成するには

island *i = malloc(sizeof(island));

独自のスコープを持っているこの文は、によって指されるメモリを割り当てます。 したがって、iは、この関数の適用範囲に限定されています。これは関数の外部ではアクセスできません。

しかし、関数は、最終的p_island0に格納されるIが指す値(メモリ位置)を返します。

関連する問題