1. 程式人生 > >海天醬油教你不知道的C語言程式設計技巧

海天醬油教你不知道的C語言程式設計技巧

在C語言程式設計中,我們經常會遇到這種情況,在某個函式中經過演算法處理以後得到一個字串型別的結果,可能需要將這個字串以指標的形式進行返回,那麼如何在函式中正確返回該字串的內容呢?
例如,定義一個函式,要求該函式能夠返回一個指向字串“I love C.”的指標並能在主程式中正確得到該字串的內容。對於初學者來說,當看到這個題目時,感覺並不難做到,可能很容易的寫出下面形式的程式碼:
程式碼中定義了一個函式getString1,其目的是返回“I love C.”字串。該函式返回值是char型別的指標,在函式內部定義了一個char型別包括20個元素的陣列str並賦值為“I love C.”,然後返回陣列的名稱str,即字串的地址。
乍一看,該函式寫的沒問題,似乎在主程式中呼叫該函式能得到正確的字串內容“I love C.”,但實際上,這種方式並不能達到我們的目的。
其原因是,在函式內部定義的str陣列是一個區域性變數,將“I love C.”字串存放在裡面,當函式呼叫結束時,區域性變數的內容將被作業系統自動收回,所以在主程式呼叫時,隨著函式getString1呼叫的結束,其內部的str陣列也就不存在了,自然也就不能將它裡面20個元素的內容返回到主程式中了。
函式中返回字串指標的正確方法
那麼,如何在函式中正確返回字串的內容呢?海天醬油提示:實際上,我們只要對上面的函式作一下修改就可以了。

該函式getString2同上面的getString1的區別是,在函式內部定義了一個指向char型別的指標p,該指標指向一個字串常量“I love C.”,我們知道,這個字串“I love C.”存放在整個程式的常量區,而並不是getString2的區域性變數,也就是說,在程式整個的執行週期內,該字串“I love C.”常量始終存在,並不會因為函式呼叫的結束而消失。
所以,指標變數p雖然是一個區域性變數,但p本身的值僅僅是一個4個位元組的指標地址值,這個地址值也就是“I love C.”的字串的地址值。當函式呼叫結束時,雖然p區域性變數不存在了,但可以將這個地址(僅4個位元組)返回到主程式中,在主程式中通過這個地址值,我們是可以得到這個字串“I love C.”的。
對比一下,字串“I love C.”在getString1函式中儲存在區域性變數區,而在getString2函式中儲存在整個程式的常量區,所以在getString2函式中將該常量區的地址返回,在主程式可以通過該地址得到這個字串的內容。
可見,getString1函式輸出的是亂碼,而getString2函式正確的輸出了字串的內容