首先,思考下面的代碼會輸出什麼呢?
運行一下程序,輸出的結果如下:
爲什麼是這樣的結果呢?也許是剛纔我們的“人品”有點差,居然出現亂碼,嘗試再運行程序一次,結果如下:
爲什麼兩次運行的結果會有不同呢?聰明的你應該知道答案了吧!
是的,在 func 1 函數中 p 是一個指向常量字符串的指針,這串常量字符串在內存中儲存在程序的 text 段(代碼段,數據只能讀不能寫)中,因此當 func1 函數返回指向該字符的指針時,我們能夠利用這個返回的指針訪問到該常量字符串,但是在 func2 函數中 p 是一個字符數組,字符數組的內容是可變的(可在程序中改變某個字符),它在內存中儲存在棧中,當 func2 函數返回時,函數所佔用的棧空間被釋放,即原有的棧空間可以被其他的函數使用,原有的數據將可能被替換爲其他的數據(數據被破壞),此時,利用 func2 函數返回的字符指針去訪問原有的棧空間,雖然可以訪問到原來的空間,但數據已經發生改變了(輸出結果不確定)。
謝謝閱讀,如有意見和建議,歡迎交流!