2012-09-19 114 views
1

这是在参考这个问题: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
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; 
     } 
+2

传递指针在这里没有意义,因为malloc会覆盖它。 –

+0

@KingsIndian:我会说,相反:在这里分配内存毫无意义,因为无论如何都会传递指针。 :P – netcoder

+1

@netcoder:这取决于是否需要调用者分配。 –

0

他们是完全不同的(如果你真正理解为什么第一个作品,你会看到没有联系)。

通过返回,您不会试图修改函数内已经存在的指针。你只是返回一个新的指针,并在外部赋值。

0

把它看作是一个范围问题。

main()你有一个指针p

int *p = 0; 

p in main设置为NULL。当你通过它的三个函数调用它p:

three(p); 

您正在传递一个指针为NULL。它会发生什么超出main()的范围。 main()不知道,也不在意发生了什么。 main()只关心它的副本p,它在这一点上仍然设置为NULL。 除非我在main()(包括移交地址p)范围内重新分配pp仍然只是一个指向NULL的指针。

如果我给你这个代码:

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

你能告诉我什么明确将要发生的(分段故障),却不知道什么funcX()做,因为我们传递的指针的一个拷贝到这个功能,但副本不会影响原件。

但如果我给你这个代码:

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

你不能告诉我会发生什么,除非你知道什么funcX()在做什么。

这有道理吗?

+0

具有完美的意义。明白了解。非常感谢! – Vikram