[英]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.