从函数返回指针

时间:2012-09-19 13:58:15

标签: c memory-management malloc

这是参考这个问题:why pointer to pointer is needed to allocate memory in 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);
    }

3 个答案:

答案 0 :(得分: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;
        }

答案 1 :(得分:0)

他们完全不同(如果你真的明白为什么第一个有效,你就会发现它没有联系)。

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

答案 2 :(得分:0)

将其视为范围问题。

main()中,您有一个指针p

int *p = 0;
main中的

p设置为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()正在做什么,否则你不能告诉我会发生什么。

那有道理吗?