一:背景
談到c語言的函式返回值,可能會感覺很親切,不就是乙個函式返回值嘛,當初學c語言的時候早就學過了很easy嘛,我曾經也是這麼想的。後來要上研究生了,研究生階段搞得就是c,所以又重新開始學習c,學習c的過程中遇到了很多問題,在此部落格中一一記錄。實際過程中遇到的第乙個問題自然就是函式返回值了。如果有人問你在乙個函式中宣告乙個字串陣列,最後再return這個陣列。這可以實現嘛?如果是問我我可能會毫不猶豫的說ok。那事實呢?由此本文誕生了......
二:問題
先看幾個實際的例子: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include
#include
char
*return_arry();
int
main (
int
argc,
char
*argv )
/* ---------- end of function main ---------- */
char
* return_arry ( )
/* ----- end of function return_arry ----- */
int
return_var ( )
/* ----- end of function return_var ----- */
linux 下gcc編譯報錯如下:
return
.c: in function 『return_arry』:
return
.c:35:2: warning: function returns address of local variable [-wreturn-local-addr]
return
str;
^
可見函式中是無法返回乙個區域性變數陣列的。那為何return_var中沒有報錯呢。
其原因在於return a 其本質是返回了a的值,而return str則是返回了這個陣列的首位址。然後str是乙個區域性變數,函式結束後這個位址就會被釋放掉。所以gcc提示。對於這類問題,我們要明確函式返回的是什麼,如果是值的話沒有關係,如果是位址的話,要看是區域性的還是全域性的還是堆的。如果是區域性的就不能返回。如果是全域性的就沒有關係了,如果是堆的那麼請記住要記得釋放掉。
三:方法
那麼對於乙個函式來說,我該怎麼返回乙個字串呢。
方法如下:
方法一:返回乙個指向字串指標的常量。 1
char
*func
參見這篇博文,常量是存放再**段的,整個程式的執行週期都在不會因為子函式的結束而釋放。
這是最簡單的解決方案,但是如果你需要對字串處理那就無能為力了。
方法二:使用全域性陣列 1
2
3
4
char
*func()
這種方法也是很簡單易用的,但是大量建立這樣的全域性字串陣列增加了程式的耦合性。並且任何人都可以修改這個全域性陣列,而且下一次函式呼叫也會覆蓋該陣列的內容。
方法三:使用靜態陣列 1
2
3
4
char
* func()
參見這篇博文,靜態變數是存放在資料段的也是整個程式執行週期都不釋放的。
這種方法比使用全域性陣列要好,可以防止任何人修改這個陣列的內容,只有擁有該陣列的指標函式才能修改這個靜態陣列。但是函式下一次呼叫將覆蓋這個陣列的內容。
方法四:顯示分配一些記憶體 1
2
3
4
5
char
*func()
參見這篇博文mlloc分配的記憶體是放在堆段的,只有程式設計者自己手動通過free來釋放記憶體的。所以不會因為函式執行完畢就釋放其記憶體。
但是這種方法要求程式設計者謹記要自己手動釋放記憶體,這種寫法不太好,因為malloc和free不在同乙個**塊中很容易忘記使用free.
方法五:也許是最好的解決方案 1
2
3
4
5
6
7
8
void
func(
char
*result,
int
size)
buffer =
malloc
(size);
func(buffer,size);
free
(buffer);
這種方案只要
malloc
和
free
的使用在乙個**塊中那麼記憶體管理就顯得輕鬆了。
四:總結
c語言真的很簡單,簡單到什麼都要自己做。
本文出自 「專注linux
」 部落格,請務必保留此出處
無返回值 C語言高階之路 函式 返回值!
c 語言的函式可以返回陣列以外 不包括陣列指標 的任何型別.不寫明返回型別,在以前的 c 語言版本中是預設返回 int,現在 c99 c 已不支援.void 表示沒有返回值,也就無須 return 語句 如果是其他語句必須有 return 語句.在 main 函式中 只是 main 函式 若忘掉 r...
C語言printf函式返回值
首先來看 為什麼會列印出這樣的結果呢?讓我們來看看 1 首先列印最內層printf的結果 43 2 其次最內層print函式 return 長度 可以看成字串長度 為 2 即 printf d printf d 2 3 最後第二個printf函式 return 長度為1 即 printf d 1 再...
C語言fgetc 函式的返回值
c語言fgetc 函式的返回值 本文 學習c語言的,檔案操作,大都會用到它。它的函式原型 int fgetc file stream 這個函式的返回值,是返回讀取的乙個位元組。如果讀到檔案末尾返回eof。eof其實就是乙個巨集 define eof 1 表示 1.既然返回的是乙個位元組,為什麼返回值...