BBS水木清华站∶精华区

发信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信区: test 
标  题: 星星流讲座 0040 
发信站: ☆清华电机☆ (Sat Jul  8 16:30:45 1995) 
 
 
第 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,谢谢。 
 
 

BBS水木清华站∶精华区