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

2021-06-17 20:51:52 字數 515 閱讀 5523

乙個錯誤的例子:

void getmemory(char *p, int num)

void test(void)

書上關於這個的解釋是:編譯器編譯時給指標引數提供臨時副本_p,使得_p=p。如果函式體內的程式修改了_p指向的內容,就導致引數p指向的內容也被做了相應的修改,因為他們指向同一記憶體空間。在本例中,_p 申請了新的記憶體,只是把_p 所指的記憶體位址改變了,但是p 絲毫未變(即修改了p本身的值而不是_p指向的物件)

我不明白的是,_p本身的值也就是它儲存的位址不就是它指向的物件位址嗎?修改了p本身的值而不是_p指向的物件 是什麼意思?難道會把_p自己的實體地址給改掉?

可以這麼理解,任何函式的呼叫,只要不是引用傳遞,那麼引數的傳遞都是在呼叫函式中產生該實參的副本,在這個例子中也就是為str指標拷貝另乙個副本p,注意p和str 是兩個不同的變數,你在呼叫函式中只是修改了p指向的內容,也就是為p指標開闢了空間,但是沒有為主函式中的str變數分配空間,所以會出錯。

你的解釋中p相當於這裡的str, _p相當於這裡的p。

指標引數傳遞記憶體

函式的引數是乙個指標,不要用該指標去申請動態記憶體 void get memory char p,int num void main void 可以得到str依舊是null。編譯器總是為每個函式的引數提供乙個臨時副本,指標引數p的副本看做是 p,編譯器使得 p p,如果函式體內的程式修改了 p指向的...

關於指標傳遞引數的理解

學習c語言至今,已經到了乙個瓶頸,難度大多來自於指標和指標的引數傳遞。指標分為一維指標 多維指標 函式指標 指標陣列 陣列指標等等 其中主要我們要了解的是一維指標和指標陣列 陣列指標。include include void allocate memory for two array int plo...

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

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