这是参考这个问题: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);
}
答案 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()
正在做什么,否则你不能告诉我会发生什么。
那有道理吗?