指標引數傳遞記憶體

2021-06-09 23:40:17 字數 839 閱讀 8023

函式的引數是乙個指標,不要用該指標去申請動態記憶體

void get_memory(char *p, int num)

void main(void)

可以得到str依舊是null。

編譯器總是為每個函式的引數提供乙個臨時副本,指標引數p的副本看做是_p,編譯器使得_p=p,如果函式體內的程式修改了_p指向的內容,同樣,就導致引數p指向的內容也做相應的修改(它們指向同一塊記憶體區域)。這也是指標可以用作輸出引數的原因。但是上例中,_p申請了新的記憶體,只是把_p本身的值修改了,即指向了新的記憶體空間,但是p本身沒有做絲毫修改(即修改_p本身的值而不是_p指向的物件)。

解決辦法;

(1) 指向指標的指標或指標的引用

void get_memory(char **p, int num)

void test1(void)

void test(void)

void test2(void)

{ char *str = null;

str = get_string1();

cout<上面的例子雖然沒有出錯,但是p指向的靜態儲存區域,「hello world」是字串常量,它的生命週期在程式結束前始終有效,無論什麼時候呼叫get_string1(),返回的始終是同乙個「唯讀的記憶體區域」,不可試圖修改它,因此,可以將返回值修改為const char *型別以避免程式無意修改字串常量。

關於指標引數的記憶體傳遞副本

乙個錯誤的例子 void getmemory char p,int num void test void 書上關於這個的解釋是 編譯器編譯時給指標引數提供臨時副本 p,使得 p p。如果函式體內的程式修改了 p指向的內容,就導致引數p指向的內容也被做了相應的修改,因為他們指向同一記憶體空間。在本例中...

指標引數的傳遞和記憶體分配

getmemory1的p是區域性變數,不能分配記憶體,會造成記憶體的洩露 getmemory2採用指向指標的指標進行分配記憶體 getmemory3 採用返回值的方式實現記憶體的分配,但分配記憶體必須用new或malloc進行分配 getmemory4會進行報錯,把陣列分配在棧上,為區域性變數,不能...

指標引數傳遞

字串傳遞1 void test char p1 int main 方法2 void test char p1 int main 方法3 void test char p1 int main 以下是錯誤的,因為在函式體內改變p1本身的值,不會影響實參p1本身的值 static char a 100 v...