之前在弄kd-tree的程式,新增node的函式內有一個小問題沒有釐清
直到看到ptt c\c++ 板的置底文中的
常見問題13誡 (13)函式內new出來的空間記得要讓主程式的指標接住
才比較清楚該釐清的觀念在哪邊
簡單來說
如果宣告一變數
int *Var;
以及一個新增空間給變數的函式
void NewSpace(int *ptr_Var,int size)
{
*ptr_Var = (int *)malloc(size * sizeof(int) );
}
若使用
NewSpace(Var,1);
結果Var依舊沒有指向剛剛函式產生的合法空間
觀念在ptt c\c++板裡面有詳細的圖文解釋
至於要如何解決這個問題,c\c++板也有提到使用雙指標的方式
而 int *Var 與 int **Var到底差在哪邊?
我們由下面的例子來敘述
int Var = 10;
int *ptr_Var = &Var;
int **ptr2ptr_Var = &ptr_Var;
Var為一個int的變數,內容為10
而 ptr_Var為指向Var的指標,其內容為Var的位址
所以prr2ptr_Var為指向指標ptr_Var的指標,其內容為存放ptr_Var的位址
所以在一開始的NewSpace的函式裡面,我們只是將ptr_Var指向的位址的值傳進去函式裡面
並且在函式立面改變其值
但是離開函式後,ptr_Var依舊指向原來的位址,並沒有做任何的改變
簡單的來說,我想改變A的值,但是我寫的函式裡面的內容是令 B=A,再改變 B,所以離開函式後A還是沒變(感覺像call by value?)
所以我們應該要做的是,將存放指標的位址傳入函式,並且改變位址裡面存放的內容(ptr_Var的值)
所以新的新增空間函式如下
void NewSpace2(int **ptr2ptr_Var,int size)
{
//改變指標記憶體的內容
*ptr2ptr_Var = (int *)malloc(size*sizeof(int) );
}
使用方式如下
int *Var;
NewSpace(&Var,1); // &Var為Var指標的位址
留言列表