發信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信區: test
標  題: 星星流講座 0040
發信站: ☆清華電機☆ (Sat Jul  8 16:30:45 1995)
轉信站: star

星星流講座 0040         C 語言教室

第 6 講 之 3            函數
                        Topic: Return value

我們現在來研究一下函數要如何正確地傳回它的傳回值。

除了回傳值資料型態為 void 的函數之外,所有的函數者必須傳回一
個值,傳值的方法很容易,請看下面的範例:

/* return the summation of array a[] */
int sum (int a[], int n)
{
    int i, sum;
    sum = 0;
    for (i = 0; i < n; i++)
        sum += a[i];
    return sum;
}

return 這個指令會立即中止函數的執行,並把其後的值傳回給函數的
呼叫者 (caller)。傳回的值它的型態必須和函數原型中宣告的一致,
如果不一致的話,必須做強制型態轉換
,例如:

int sum (double a[], int n)
{
    int i;
    double sum = 0;
    for (i = 0; i < n; i++)   
        sum += a[i];
    return (int) sum;
}


傳回值也可以是一個指標,例如:

char *err_msg (int errno)
{
    static char *mesg[] = {"Error 1", "Error 2"};

    return mesg[errno];
}

我們最常見的傳回指標錯誤就是像這個樣子:

/* err.c */
#include <stdio.h>
#include <string.h>

char *err_msg (void);

void main (void)
{
    printf ("%s\n", err_msg ());
}

char *err_msg (void)
{
    char buf[10];
    strcpy (buf, "Error 1");

    return buf;
}

這個程式看起來一切都很好,那兒錯了呢?錯就錯在 buf 是一個自動變數,
當 err_msg 這個函數結束的時候,buf 就被消滅了,所以你傳回來的東西等
於是一堆垃圾。怎麼解決?想想靜態變數吧!

--
本文原作者為徐振家,原作刊載於星星神教總壇 ☆清華電機☆ test 板。
你可以以電子文件的形式將本文自由流傳於台灣學術網路,但必須包含此版權聲明。
原作者依中華民國著作權法之規定,享有本文之著作權,請勿抄襲以免觸法。
未經授權任何人不得以任何形式對本文做任何修改及商業上之應用。
其他網路的轉載或其他用途的應用,請先知會作者,並取得其同意。
對本文有任何疑問或意見請 mail 給 ax.bbs@bbs.ee.nthu.edu.tw,謝謝。