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。

您最初传入了您的副本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

它们是完全不同的(如果你真正理解第一个工作的原因,你会发现没有任何联系)。

通过返回,您不会尝试从函数内部修改已经存在的指针。您只是返回一个新指针,并将其值分配给外部。

于 2012-09-19T14:01:02.583 回答
0

将其视为范围问题。

main()你有一个指针p

int *p = 0;

p在 main 中设置为 NULL。当您调用传递它 p 的三个函数时:

three(p);

您正在传递一个指向 NULL 的指针。它发生的事情不在main(). main()不知道,也不关心发生了什么。main()只关心它的副本p,此时仍设置为 NULL。除非我p在范围内重新赋值main()(包括交出地址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()

有道理?

于 2012-09-19T14:15:26.620 回答