1

これは、この質問に関連しています:関数にメモリを割り当てるためにポインターへのポインターが必要な理由

質問への答えは、なぜこれがうまくいかないのかを説明しました:

    void three(int * p) 
    {
        p = (int *) malloc(sizeof(int));
        *p=3;
    }

    void main()
    {
        int *p = 0;
        three(p);
        printf("%d",*p);
    }

...しかし、これは機能します:

    void three(int ** p) 
    {
        *p = (int *) malloc(sizeof(int));
        **p=3;
    }

    void main()
    {
        int *p = 0;
        three(&p);
        printf("%d",*p);
    }

私の質問は、関数からポインターを返すことで、これも機能するということです。何故ですか?

    int* three(int * p) 
    {
        p = (int *) malloc(sizeof(int));
        *p=3;
        return p;
    }

    void main()
    {
        int *p = 0;
        p=three(p);
        printf("%d",*p);
    }
4

3 に答える 3

3
int* three(int * p) 
    {
        p = (int *) malloc(sizeof(int));
        *p=3;
        return p;
    }

ここではポインターのコピーpを返しているため、このポインターは現在、値 3 を含む有効なメモリを指しています。

元々引数としてyourのコピーpを渡したので、渡したものを変更するのではなく、コピーを変更します。次に、そのコピーを返して割り当てます。

非常に有効なポイントであるコメントから、これも同様に機能します。

 int* three() 
        {
           //no need to pass anything in. Just return it.
            int * p = (int *) malloc(sizeof(int));
            *p=3;
            return p;
        }
于 2012-09-19T14:00:39.557 に答える
0

範囲の問題としてそれを見てください。

あなたにはmain()ポインタがありますp

int *p = 0;

pメインでは NULL に設定されています。p を渡す 3 つの関数を呼び出すと、次のようになります。

three(p);

NULL へのポインタを渡しています。それに何が起こるかは の範囲外ですmain()main()何が起こるかを知りませんし、気にもしません。この時点ではまだ NULL に設定されているmain()のコピーのみを考慮します。の範囲内でp再割り当てしない限り( のアドレスの引き渡しを含む)、は NULL を指すポインターにすぎません。pmain()pp

このコードを渡すと:

void main()     
{
     int *p = 0;
     funcX(p);
     printf("%d",*p);     
} 

この関数にポインターのコピーを渡しているため、何が起こるかを知らなくても、何が起こるか (セグメンテーション違反) を明確に伝えることができますfuncX()が、コピーは元に影響しません。

しかし、私があなたにこのコードを与えると:

void main()     
{
     int *p = 0;
     funcX(&p);
     printf("%d",*p);     
} 

何が起こっているかを知らなければ、何が起こるかわかりませんfuncX()

意味がある?

于 2012-09-19T14:15:26.620 に答える
0

それらは完全に異なります (そして、最初の機能が機能する理由を本当に理解している場合は、接続がないことがわかります)。

戻ることで、関数内から既存のポインターを変更しようとしているわけではありません。新しいポインターを返し、その値を外部に割り当てているだけです。

于 2012-09-19T14:01:02.583 に答える