🎈前言 :
今天博主來講解4道經典的指標筆試題,很多朋友沒有深刻理解函式傳參知識都會在這些題目上出錯,下面話不多說,我們開始 ~
目錄
- 🎈前言 :
- 題目一(有關傳值呼叫與非法訪問)
- 題目二 (回傳堆疊空間地址的問題 )
- 題目三 (區別傳值呼叫的傳址呼叫)
- 題目四 (free釋放的時機)
- 🎇結尾:
題目一(有關傳值呼叫與非法訪問)
請問運行Test 函式會有什么樣的結果?

答 :
程式運行會崩潰 ! 且存在記憶體泄漏 ;
原因:
1.str傳給p的時候,是值傳遞,p是str的臨時拷貝,所以當malloc開辟的空間起始地址放在p中的時候,不會影響str,str依然為空指標NULL ;
2.當str是NULL,strcpy想把 hello world 拷貝到str指向的空間時,程式就崩潰了,因為NULL指向的空間是不能直接訪問的,造成了非法訪問;
3.malloc開辟的空間沒有free釋放也沒有制空,程式不結束就會一直存在,造成了記憶體泄漏;
正確改正方式為:

題目二 (回傳堆疊空間地址的問題 )
請問運行Test 函式會有什么樣的結果?

此類問題是 : 回傳堆疊空間地址的問題
答 :
程式運行列印的是隨機值 ;
原因 :
GetMemory函式回傳的p是陣列名,也就是陣列首元素h的地址 ;
但是 ! GetMemory函式創建是在堆疊空間上創建的,return后會銷毀,空間還給作業系統,雖然下面Test函式中的str存了h的地址,但是如果進行列印,原來的空間已經被銷毀,列印的內容自然不是想要的內容;(雖然有可能依然列印出 hello world ,那是因為空間暫時還沒被覆寫使用,本質上依然是錯誤的),
題目三 (區別傳值呼叫的傳址呼叫)
請問運行Test 函式會有什么樣的結果?

答 :
雖然能成功列印出 hello world ,但是造成了記憶體泄漏 , 要記得 free 釋放和制空 ;
原因 :
這里傳的是str的地址,區別題目1的傳值呼叫,這里是傳址呼叫,形參的改變能影響實參;
malloc開辟的空間地址交給了str ,str指向了這塊空間,所以strcpy能成功使用這塊空間實作列印內容;
但是沒有釋放malloc動態開辟的這塊空間,也沒有制空,造成了記憶體泄漏 ;
題目四 (free釋放的時機)
請問運行Test 函式會有什么樣的結果?

這道題比較簡單 ,決議給在了代碼注釋中 ,大家注意查看 ,
🎇結尾:
有關這四道經典的指標筆試題講解就到此結束了,如果覺得文章對自己有所幫助,歡迎大家多多點贊收藏? ~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/306223.html
標籤:java
上一篇:【遞回演算法01】遞回的呼叫機制
下一篇:圖書管理系統--Java實作
