C/C++學習交流:8群 491994603
C語言允許函數的返回值是一個指標(位址),
我們將這樣的函數稱為指標函數。
下面的例子定義了一個函數 strlong(),
用來返回兩個字串中較長的一個:
C/C++學習交流:8群 491994603
用指標作為函數返回值時需要注意的一點是, 函數運行結束後會銷毀在它內部定義的所有局部資料, 包括區域變數、局部陣列和形式參數, 函數返回的指標請儘量不要指向這些資料, C語言沒有任何機制來保證這些資料會一直有效,
C/C++學習交流:8群 491994603
n 是 func() 內部的區域變數, func() 返回了指向 n 的指標, 根據上面的觀點, func() 運行結束後 n 將被銷毀, 使用 *p 應該獲取不到 n 的值。 但是從運行結果來看, 我們的推理好像是錯誤的,
為了進一步看清問題的本質, 不妨將上面的代碼稍作修改, 在第9~10行之間增加一個函式呼叫, 看看會有什麼效果:
C/C++學習交流:8群 491994603
可以看到, 現在 p 指向的資料已經不是原來 n 的值了,
前面我們說函數運行結束後會銷毀所有的局部資料, 這個觀點並沒錯, 大部分C語言教材也都強調了這一點。 但是, 這裡所謂的銷毀並不是將局部資料所佔用的記憶體全部抹掉, 而是程式放棄對它的使用權限, 棄之不理, 後面的代碼可以隨意使用這塊記憶體。 對於上面的兩個例子, func() 運行結束後 n 的記憶體依然保持原樣, 值還是 100, 如果使用及時也能夠得到正確的資料, 如果有其它函數被調用就會覆蓋這塊記憶體, 得到的資料就失去了意義。
關於函式呼叫的原理以及函數如何佔用記憶體的更多細節, 將在《C/C++學習交流:8群 491994603》中深入探討, 相信你必將有所頓悟, 解開心中的謎團。