問題提出
在C語言編程中,我們經(jīng)常會遇到這種情況,在某個函數(shù)中經(jīng)過算法處理以后得到一個字符串類型的結(jié)果,可能需要將這個字符串以指針的形式進行返回,那么如何在函數(shù)中正確返回該字符串的內(nèi)容呢?
例如,定義一個函數(shù),要求該函數(shù)能夠返回一個指向字符串“I love C.”的指針并能在主程序中正確得到該字符串的內(nèi)容。對于初學(xué)者來說,當看到這個題目時,感覺并不難做到,可能很容易的寫出下面形式的代碼:
代碼中定義了一個函數(shù)getString1,其目的是返回“I love C.”字符串。該函數(shù)返回值是char類型的指針,在函數(shù)內(nèi)部定義了一個char類型包括20個元素的數(shù)組str并賦值為“I love C.”,然后返回數(shù)組的名稱str,即字符串的地址。
乍一看,該函數(shù)寫的沒問題,似乎在主程序中調(diào)用該函數(shù)能得到正確的字符串內(nèi)容“I love C.”,但實際上,這種方式并不能達到我們的目的。
其原因是,在函數(shù)內(nèi)部定義的str數(shù)組是一個局部變量,將“I love C.”字符串存放在里面,當函數(shù)調(diào)用結(jié)束時,局部變量的內(nèi)容將被操作系統(tǒng)自動收回,所以在主程序調(diào)用時,隨著函數(shù)getString1調(diào)用的結(jié)束,其內(nèi)部的str數(shù)組也就不存在了,自然也就不能將它里面20個元素的內(nèi)容返回到主程序中了。
函數(shù)中返回字符串指針的正確方法
那么,如何在函數(shù)中正確返回字符串的內(nèi)容呢?實際上,我們只要對上面的函數(shù)作一下修改,如下圖所示就可以了:
該函數(shù)getString2同上面的getString1的區(qū)別是,在函數(shù)內(nèi)部定義了一個指向char類型的指針p,該指針指向一個字符串常量“I love C.”,我們知道,這個字符串“I love C.”存放在整個程序的常量區(qū),而并不是getString2的局部變量,也就是說,在程序整個的運行周期內(nèi),該字符串“I love C.”常量始終存在,并不會因為函數(shù)調(diào)用的結(jié)束而消失。
所以,指針變量p雖然是一個局部變量,但p本身的值僅僅是一個4個字節(jié)的指針地址值,這個地址值也就是“I love C.”的字符串的地址值。當函數(shù)調(diào)用結(jié)束時,雖然p局部變量不存在了,但可以將這個地址(僅4個字節(jié))返回到主程序中,在主程序中通過這個地址值,我們是可以得到這個字符串“I love C.”的。
對比一下,字符串“I love C.”在getString1函數(shù)中存儲在局部變量區(qū),而在getString2函數(shù)中存儲在整個程序的常量區(qū),所以在getString2函數(shù)中將該常量區(qū)的地址返回,在主程序可以通過該地址得到這個字符串的內(nèi)容。
C語言完整的測試代碼
針對上面的兩種情況,完整的C語言測試代碼如下:
其運行結(jié)果如下圖所示:
可見,getString1函數(shù)輸出的是亂碼,而getString2函數(shù)正確的輸出了字符串的內(nèi)容。
總結(jié)
通過這個例子大家可以理解怎樣在函數(shù)中正確返回一個字符串的指針,也可以理解C語言程序中不同變量的作用域范圍。
如果你覺得這篇文章對你有用的話,請不要忘記點贊哦。
聯(lián)系客服