2

次のコードを定義するとします。

int *func()
{
    int *p=(int *)malloc(sizeof(int)); // memory is allocated from heap
                                      // which can be accessed anytime.

    return p;    // but we created p which has a local scope and vanishes as
                 //soon as function exits.  
}

では、これはどのように機能しますか?p はローカル変数 (動的メモリへのアドレスを保持するポインタ) です。つまり、HEAP からのメモリ自体は確実に存在し続けるはずですが、ポインター変数にはローカル スコープがあります。どうしてこのポインターを取得できるのでしょうか?

4

2 に答える 2

4

p割り当てたメモリ ブロックを参照する単なるポインタです。

割り当てられたブロックの有効期間は、関数の終了を超えて延長されます。

実際のポインターが戻り時にスコープ外になることは事実ですが、それ以前に呼び出し元にそのコピーを既に返しています。

余談ですが、 (どちらの場合も) andint*ではなくおそらく意味がありました。いずれにしても、C からの戻り値を明示的にキャストしたくはありません。微妙なエラーを隠すことができます。C は、返された byを任意の適切なポインター型に完全に変換できます。*int(*int)mallocvoid *malloc

次のように書くとよいでしょう。

int *func (void) {
    int *p = malloc (sizeof (int));
    return p;
}

void関数内で を使用して、関数がパラメーターをとらないことを明示的に示していることにも気付くでしょう。()これは、どちらが微妙に異なるか (不確定な数のパラメーター)よりも望ましい方法です。

于 2012-08-27T08:18:08.747 に答える
2

ついに理解した後…コンセプトを理解することができました。

  1. ポインタp...を返すと、スタックに割り当てられていたpが消えます。

  2. 値は値による呼び出しメカニズムで返され、pはヒープに割り当てられたメモリのアドレスを保持していたためです。そのアドレスはまだ有効であり、有効なメモリ位置への参照を保持しています。

  3. したがって、p自体は消えますが、pによって返される値は、呼び出し元の関数の変数にコピーされるため、コードの正確性が正当化されます。

于 2012-08-29T09:19:10.487 に答える