您的位置:首頁>正文

C/C++免費線上學習,隨時隨地都可以學習,指標函數精華篇

C/C++學習交流:8群 491994603


C語言允許函數的返回值是一個指標(位址), 我們將這樣的函數稱為指標函數。 下面的例子定義了一個函數 strlong(), 用來返回兩個字串中較長的一個:

C/C++學習交流:8群 491994603

用指標作為函數返回值時需要注意的一點是, 函數運行結束後會銷毀在它內部定義的所有局部資料, 包括區域變數、局部陣列和形式參數, 函數返回的指標請儘量不要指向這些資料, C語言沒有任何機制來保證這些資料會一直有效,

它們在後續使用過程中可能會引發執行階段錯誤。 請看下面的例子:

C/C++學習交流:8群 491994603

n 是 func() 內部的區域變數, func() 返回了指向 n 的指標, 根據上面的觀點, func() 運行結束後 n 將被銷毀, 使用 *p 應該獲取不到 n 的值。 但是從運行結果來看, 我們的推理好像是錯誤的,

func() 運行結束後 *p 依然可以獲取區域變數 n 的值, 這個上面的觀點不是相悖嗎?

為了進一步看清問題的本質, 不妨將上面的代碼稍作修改, 在第9~10行之間增加一個函式呼叫, 看看會有什麼效果:

C/C++學習交流:8群 491994603

可以看到, 現在 p 指向的資料已經不是原來 n 的值了,

它變成了一個毫無意義的甚至有些怪異的值。 與前面的代碼相比, 該段代碼僅僅是在 *p 之前增加了一個函式呼叫, 這一細節的不同卻導致運行結果有天壤之別, 究竟是為什麼呢?

前面我們說函數運行結束後會銷毀所有的局部資料, 這個觀點並沒錯, 大部分C語言教材也都強調了這一點。 但是, 這裡所謂的銷毀並不是將局部資料所佔用的記憶體全部抹掉, 而是程式放棄對它的使用權限, 棄之不理, 後面的代碼可以隨意使用這塊記憶體。 對於上面的兩個例子, func() 運行結束後 n 的記憶體依然保持原樣, 值還是 100, 如果使用及時也能夠得到正確的資料, 如果有其它函數被調用就會覆蓋這塊記憶體, 得到的資料就失去了意義。

關於函式呼叫的原理以及函數如何佔用記憶體的更多細節, 將在《C/C++學習交流:8群 491994603》中深入探討, 相信你必將有所頓悟, 解開心中的謎團。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示