【原】C語言函數返回數組的問題


有些時候需要子函數將一個數組返回出來,通常是兩種方法,一種是靠指針,另一種是結構體。

一、先來看依靠指針怎么做

例程1:

 1 #include "stdio.h"
 2 
 3 char *test(char *tmp)
 4 {
 5     return tmp;
 6 }
 7 
 8 void main(void)
 9 {
10     printf("%s",test("第一個測試例子\n"));
11 }

 

例程1中的test函數如果寫成下面的形式,就無法順利編譯。

例程2:

 1 #include "stdio.h"
 2 
 3 char *test()
 4 {
 5     //char tmp[30]="第一個測試例子\n";//寫成這樣編譯時彈出警告,最后的結果也是亂碼
 6     char *tmp="第一個測試例子";//寫成這樣可以用指針返回數組首地址
 7     return tmp;
 8 }
 9 
10 void main(void)
11 {
12     printf("%s",test());
13 }

之所以*tmp可以而tmp[30]不可以,是因為tmp[30]是個局部變量,子函數結束時該數組地址雖然沒變,但是里面的值已經無意義了,而*tmp是定義了一個全局變量。

但是有些時候我們必須用到類似tmp[30]而不是*tmp,這時就要用到static這個關鍵字:

例程3:

 1 #include "stdio.h"
 2 
 3 char *test()
 4 {
 5     static char tmp[30]="第三個測試例子";
 6     return tmp;
 7 }
 8 
 9 void main(void)
10 {
11     printf("%s",test());
12 }

 在數組tmp[30]前面加入了static關鍵字,它就使得tmp[30]存放在內存中的靜態存儲區中,所占用的存儲單元一直不釋放直到整個程序運行結束.所以當主函數調用完print()函數后,該空間依然存在.所以main()函數中接到首地值后可以訪問數組中的元素.

二、使用結構體作為返回值來傳遞數組:

 1 #include "stdio.h"
 2 #include "string.h"
 3 
 4 struct ret
 5 {
 6     char buf[30];
 7 };//定義結構體時不要忘了分號
 8 
 9 struct ret test(char *tmp)
10 {
11     struct ret a;
12     strcpy(a.buf,tmp);
13     return a;
14 }
15 
16 
17 void main(void)
18 {
19     struct ret b;
20     b=test("用結構體作為返回值傳遞數組");
21     printf("%s",b.buf);
22 }

兩點注意:

1、數組之間的賦值不要直接,即不要直接將數組A賦給數組B,而是要用strcpy(字符型數組)或者memcpy(非字符型數組)。

2、用結構體定義變量和函數時不要忘了結構體名(上面程序的ret)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM