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,...