0

次の署名でmalloc呼び出されるラッパーを実装する必要があります。mymalloc

void mymalloc(int size, void ** ptr)

メインプログラムで型キャストがvoid**不要になり、正しいポインタ(型キャストなし)の所有権がに残るようにするために必要ですmain()

void mymalloc(int size, void ** ptr)
{
    *ptr = malloc(size) ;
}
main()
{
    int *x;
    mymalloc(4,&x); // do we need to type-cast it again?
                    // How does the pointer mechanism work here?
}

さて、渡されるポインターは再び型キャストされる必要がありますか、それとも暗黙的に型キャストされますか?

これがどのように機能するのかわかりません。

4

3 に答える 3

3

mallocを返しますvoid*。関数の場合、ユーザーは最初に独自のローカルvoid*変数を作成し、それへのポインターを提供する必要があります。その後、関数はその変数に値を設定することが期待されます。したがって、署名に余分なポインターがあり、関数に逆参照があり、クライアント コードにアドレス演算子があります。

典型的なパターンは次のとおりです。

void do_work_and_populate(T * result)
{
     *result = the_fruits_of_my_labour;
}

int main()
{
    T data;                      // uninitialized!
    do_work_and_populate(&data); // pass address of destination
    // now "data" is ready
}

あなたの使用例では、代替T = void *、およびあなたの労働の成果はmalloc(プラスチェック)の結果です。

ただし、 anint*は a と同じではないことに注意してください。そのため、単にoff のアドレスを void ポインターのアドレスとしてvoid*渡すことはできません。x代わりに、次のものが必要です。

void * p;
my_malloc(&p);
int * x = p;  // conversion is OK
于 2012-06-23T19:22:53.617 に答える
2

とは異なりvoid *、型void **はジェネリック ポインター型ではないため、型が異なる場合は代入の前にキャストする必要があります。

于 2012-06-23T19:20:04.677 に答える
0
void ** ptr

ここで、「ptr」はポインタへのポインタであり、ポインタの配列へのポインタとして扱うことができます。結果はそこに格納されるため (mymalloc からは何も返されない)、"ptr" に何を割り当てたいかを明確にする必要があります。引数「サイズ」は十分な説明ではありません。

于 2012-06-23T19:23:29.700 に答える