之前在弄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指標的位址


創作者介紹
創作者 weihann 的頭像
weihann

Enjoy Life

weihann 發表在 痞客邦 留言(0) 人氣()