C語言經典指針筆試題詳解

題目一(有關傳值調用與非法訪問)

請問運行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 函數會有什麼樣的結果?

在這裡插入圖片描述

這道題比較簡單 ,解析給在瞭代碼註釋中 ,大傢註意查看 。

🎇結尾:

有關這四道經典的指針筆試題講解就到此結束瞭,如果覺得文章對自己有所幫助,歡迎大傢多多點贊收藏✨ ~

到此這篇關於C語言經典指針筆試題詳解的文章就介紹到這瞭,更多相關C語言 指針內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: