簡體   English   中英

從函數返回指針

[英]Returning a pointer from a function

這是參考這個問題: 為什么需要指針指針來在函數中分配內存

該問題的答案解釋了為什么這不起作用:

    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);
    }
int* three(int * p) 
    {
        p = (int *) malloc(sizeof(int));
        *p=3;
        return p;
    }

因為這里你返回指針p副本 ,這個指針現在指向有效內存,其中包含值3。

您最初傳遞了p副本作為參數,因此您不會更改傳入的副本,而是更改副本。 然后返回該副本,並分配它。

從評論中,這是一個非常有效的觀點,這也將同樣有效:

 int* three() 
        {
           //no need to pass anything in. Just return it.
            int * p = (int *) malloc(sizeof(int));
            *p=3;
            return p;
        }

它們完全不同(如果你真的明白為什么第一個有效,你就會發現沒有聯系)。

通過返回,您不會嘗試從函數內部修改已存在的指針。 您只是返回一個新指針,並將其值分配給外部。

將其視為范圍問題。

main()你有一個指針p

int *p = 0;

main中的p設置為NULL。 當你調用傳遞它的三個函數時p:

three(p);

您正在將指針傳遞給NULL。 它發生的事情超出了main()的范圍。 main()不知道,也不關心會發生什么。 main()只關心它的p副本,此時它仍然設置為NULL。 除非我在main()的范圍內重新分配p (包括切換p的地址),否則p仍然只是一個指向NULL的指針。

如果我給你這個代碼:

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

您可以明確地告訴我將要發生什么(分段錯誤)而不知道funcX()是什么,因為我們將指針的副本傳遞給此函數,但副本不會影響原始函數。

但是,如果我給你這個代碼:

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

除非你知道funcX()正在做什么,否則你不能告訴我會發生什么。

有道理?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM