C語言的函式返回值

2021-09-02 04:21:13 字數 3557 閱讀 5934

一:背景

談到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();

intmain (intargc,char*argv )

/* ----------  end of function main  ---------- */

char* return_arry ( )

/* -----  end of function return_arry  ----- */

intreturn_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]

returnstr;

^

可見函式中是無法返回乙個區域性變數陣列的。那為何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

voidfunc(char*result,intsize)

buffer =malloc(size);

func(buffer,size);

free(buffer);

這種方案只要mallocfree的使用在乙個**塊中那麼記憶體管理就顯得輕鬆了。

四:總結

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.既然返回的是乙個位元組,為什麼返回值...