GetMemory函式詳解

2021-08-08 21:34:48 字數 1220 閱讀 9404

void getmemory(char *p)

void test()

實質:getmemory(str)在呼叫時會生成乙個_str與str指向同乙個數,這是因為c語言中函式傳遞形參不改變實參的內容,但是指標指向的內容是相同的,因此可以用指標控制資料。題中的getmemory(str),實質是對_str的操作,並沒有對str操作,函式結束後_str撤銷,因此不會產生新的記憶體空間,str仍然是乙個空指標。

要在函式內部改變某個變數的值,使之能在出了這個函式後,剛才的改變仍然有效,那就必須通過引數傳入「指向這個變數的指標」,而不是變數本身。也就是說,任何函式都不能把對引數本身的改變帶到函式體外,所改的只是這個引數所指向的變數的值。

[cpp]

view plain

copy

void

func1(

char

*p)  

intmain()    

[cpp]

view plain

copy

void

func2(

char

**p)  

intmain()    

no2char *getmemory()

void test()

實質:當乙個函式呼叫結束後會釋放記憶體空間,釋放它所有變數所占用的空間,所以陣列空間被釋放掉了,也就是說str所指向的內容不確定是什麼東西。但是返回的指標指向的位址是一定的。

no3char *getmemory()

void test()

實質:本例列印hello world,因為返回常量區,而且並沒有修改過。在上乙個例子中不一定能列印hello world,因為指向的是棧區。

no4void getmemory(char **p,int num)

void test()

可以正確的列印hello但是記憶體洩露了,在getmemory()中使用了malloc申請記憶體,但是在最後卻沒有對申請的記憶體做任何處理,因此可能導致記憶體的洩露,非常危險。

no5void test()

}申請空間,拷貝字串,釋放空間,前三步操作都沒有問題,到了if語句裡的判斷條件開始出錯了。因為乙個指標被釋放了之後其內容並不是null,而是乙個不確定的值,所以if語句永遠不能被執行(注:strcpy(str,"world")有風險),這也是著名的「野」指標問題。

no6void getmemory(void)

}str 為野指標,列印的結果不能確定。

GetMemory函式詳解

include include include using namespace std char getmemory char p,int num int main void getmemory錯誤講解 指標練習 錯誤程式 void getmemory char p void test void 這...

筆試題 GetMemory 函式

void getmemory char p p char malloc 100 void test char str null getmemory str strcpy str,helloworld printf str 實質 getmemory str 在呼叫時會生成乙個 str與str指向同乙個...

GetMemory函式的幾種經典考法

void getmemory char p int main int argc,char argv str沒有得到分配記憶體的位址值。記憶體空間狀態 首先申請了四個位元組的棧空間,存放str指標,此時str的值為0,存放str的這塊記憶體的位址值為0x0012ff7c。呼叫函式 getmemory,...