查看: 5118  |  回复: 19

东山

木虫 (正式写手)


[交流] 一种函数多个返回值的方法,大家探讨一下可行性吧

原文地址http://anony3721.blog.163.com/blog/static/511974201072984326889/

在C中,正常情况下,我们只能从函数中返回一个值。但在很多情况下,我们需要从函数中返回多个值,此时使用数组或指针能够很好地完成这样的任务。这里是一个示例。这个程序使用一个整型数组作为参数,并将数组元素的和与积返回给调用函数。下面是C代码,这是一种常见情况。下面给出实现技巧:

#include
#include
int* Pool(int array[],int size)  
{  
   int *x;  
   int i=0;  
   int a[2]={0,1};  
   for(i=0;i    {  
      a[0]+=array;                       //存储数组元素值的和  
      a[1]*=array;                       //存储数组元素值的积  
   }  
   //将数组的基地址赋值给整型指针  
   x=&a[0];  
   //返回整个数组  
   return x;  
}  

int main()  
{  
   int a[]={1,2,3,4};  
   int *c; c = Pool(a,4);  
   printf("Sum = %d\nProduct = %d\n",c[0],c[1]);  
   getch();  
   return 0;  
}


有一个问题是数组a[2]是局部变量,其地址是否还能返回
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
回帖支持 ( 显示支持度最高的前 50 名 )
★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
小木虫: 金币+0.5, 给个红包,谢谢回帖
xzhdty: 金币+2, 谢谢老汉 2012-07-03 10:56:08
东山: 金币+8, 细心解说,专业到位,非常感谢,不过剩下的得给另一位前辈,不能全给,万望见谅 2012-07-06 10:39:48
这么写程序,害吟不浅咯。
俺出一把小手儿咯。
CODE:
#include
#include

int Pool(int * a,int asize, int * c, int csize)  
{
   int i=0;
   if (a== NULL || c == NULL)
   {
       return 0;
   }
   c[0]=0;
   c[1]=0;
   for(i=0;i    {  
      c[0]+=a[i];                  //存储数组元素值的和
      c[1]*=a[i];                   //存储数组元素值的积
   }  
   return 1;
}  

int main()  
{  
   int a[]={1,2,3,4};  
   int c[2];  
   if (Pool(a, sizeof (a)/sizeof (a[0]), c, sizeof (c)/sizeof (c[0])))
   {
       printf("Sum = %d\nProduct = %d\n",c[0],c[1]);
   }
   else
   {
       printf("What the hell....");
   }
   getch();  
   return 0;  
}

[ Last edited by yalefield on 2012-7-3 at 10:56 ]
2楼2012-07-03 10:54:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

东山

木虫 (正式写手)


引用回帖:
2楼: Originally posted by yalefield at 2012-07-03 10:54:00
这么写程序,害吟不浅咯。
俺出一把小手儿咯。

#include <stdio.h>
#include <conio.h>

int Pool(int * a,int asize, int * c, int csize)  
{
   int i=0;
   if (a== NULL || c == NULL ...

你的这种方式挺好的,那能不能帮忙分析一下我发的帖子里面那种方式问题所在呢?
4楼2012-07-03 11:13:08
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
★
小木虫: 金币+0.5, 给个红包,谢谢回帖
引用回帖:
4楼: Originally posted by 东山 at 2012-07-03 11:13:08
你的这种方式挺好的,那能不能帮忙分析一下我发的帖子里面那种方式问题所在呢?...

函数返回的,只是一个临时的空间,如果您不用一个恰当的盆子接住,那就木有咯。

所以咯,以俺大半辈子编程的经验,以及大量印度、美国、日本、欧洲程序员的习惯,函数的返回值就是int,用以表达成功、失败(各种失败,懊恼、愤怒、不屑、吃醋、忧虑等)。其余的,都通过参数(特别是指针)来完成。

参数,如您前面自己体会的,如果太多,可以设计成一个结构。

» 本帖已获得的红花(最新10朵)

5楼2012-07-03 12:07:09
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wpacer

铁虫 (正式写手)


a2是局部变量,从堆上分配的,函数返回时其值不可预料,所以不可行

» 本帖已获得的红花(最新10朵)

6楼2012-07-03 14:53:35
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

东山

木虫 (正式写手)


送鲜花一朵
引用回帖:
5楼: Originally posted by yalefield at 2012-07-03 12:07:09
函数返回的,只是一个临时的空间,如果您不用一个恰当的盆子接住,那就木有咯。

所以咯,以俺大半辈子编程的经验,以及大量印度、美国、日本、欧洲程序员的习惯,函数的返回值就是int,用以表达成功、失败(各种 ...

嗯嗯,好的好的,感谢
7楼2012-07-03 15:14:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

东山

木虫 (正式写手)


送鲜花一朵
引用回帖:
6楼: Originally posted by wpacer at 2012-07-03 14:53:35
a2是局部变量,从堆上分配的,函数返回时其值不可预料,所以不可行

谢了
8楼2012-07-03 15:15:11
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

fzr417

木虫 (正式写手)


★ ★
小木虫: 金币+0.5, 给个红包,谢谢回帖
东山: 金币+1, 感谢帮助 2012-07-06 10:43:21
你的那个不可以,而且是绝对不可以,会出现不可预料的问题,应该直接在形参里面用指针返回多个参数

建议看看c语言里面的指针部分

» 本帖已获得的红花(最新10朵)

9楼2012-07-03 22:06:52
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

nakada3861

新虫 (正式写手)


★ ★
小木虫: 金币+0.5, 给个红包,谢谢回帖
东山: 金币+1, 感谢帮助 2012-07-06 10:42:11
你的方法是绝对不可以的,的确容易发生不可预知的错误,由于你用的是局部变量,所以从函数返回后程序的空间就被释放了,返回的那个指针所指向的地址,可能会被其他函数所占用。

» 本帖已获得的红花(最新10朵)

10楼2012-07-03 22:11:48
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

东山

木虫 (正式写手)


送鲜花一朵
引用回帖:
10楼: Originally posted by nakada3861 at 2012-07-03 22:11:48
你的方法是绝对不可以的,的确容易发生不可预知的错误,由于你用的是局部变量,所以从函数返回后程序的空间就被释放了,返回的那个指针所指向的地址,可能会被其他函数所占用。

嗯嗯,懂了,谢谢
11楼2012-07-04 07:51:59
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

东山

木虫 (正式写手)


送鲜花一朵
引用回帖:
9楼: Originally posted by fzr417 at 2012-07-03 22:06:52
你的那个不可以,而且是绝对不可以,会出现不可预料的问题,应该直接在形参里面用指针返回多个参数

建议看看c语言里面的指针部分

谢了谢了
12楼2012-07-04 07:52:21
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

matrixword

铁虫 (初入文坛)


★
小木虫: 金币+0.5, 给个红包,谢谢回帖
不能返回局部定义的数组变量a的引用,函数结束时存储a的内存也随之释放
13楼2013-06-16 21:56:55
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

低调的路人

新虫 (初入文坛)


引用回帖:
5楼: Originally posted by yalefield at 2012-07-03 12:07:09
函数返回的,只是一个临时的空间,如果您不用一个恰当的盆子接住,那就木有咯。

所以咯,以俺大半辈子编程的经验,以及大量印度、美国、日本、欧洲程序员的习惯,函数的返回值就是int,用以表达成功、失败(各种 ...

为啥会有吃醋呢。。。
14楼2013-06-21 15:34:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
★
小木虫: 金币+0.5, 给个红包,谢谢回帖
引用回帖:
14楼: Originally posted by 低调的路人 at 2013-06-21 15:34:02
为啥会有吃醋呢。。。...

吃醋:跟伦家抢内存没抢到......
15楼2013-06-21 17:19:38
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ElysiumF8

新虫 (初入文坛)


★ ★
小木虫: 金币+0.5, 给个红包,谢谢回帖
jjdg: 金币+1, 感谢参与 2013-09-01 00:49:40
函数体中定义数组并返回时毫无意义的,函数的调用时在栈空间上进行的,而栈上的内容会随着函数执行的结束被释放,企图返回一个已经被释放了的对象是严重的错误。如果你非要这么做,这个数组的首地址应当是被new出来的,因为这样它就被存在了堆空间上,不会随着函数执行结束而被销毁,但是这样的另一个缺点就是new出来的不会自动释放,必须在后续代码中使用delete释放。在effective C++里Scot就明确指出不要试图让函数返回指针,这是很危险的。如果非要这么做,可以试试引用。
16楼2013-08-28 00:35:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

hywC

新虫 (小有名气)


★ ★
小木虫: 金币+0.5, 给个红包,谢谢回帖
jjdg: 金币+1, 感谢参与 2013-09-01 00:49:28
引用回帖:
2楼: Originally posted by yalefield at 2012-07-03 10:54:00
这么写程序,害吟不浅咯。
俺出一把小手儿咯。

#include
#include

int Pool(int * a,int asize, int * c, int csize)  
{
   int i=0;
   if (a== NULL || c == NULL)
   {
    ...

你好,这个程序我在VC2010上创建了一个win32控制台应用程序,但是出现编译错误,请问是什么原因:

for(i=0;i    {  
      c[0]+=a;                  //存储数组元素值的和
      c[1]*=a;                   //存储数组元素值的积
   }  
   return 1;
}  
这一句

缺少“)”(在“{”的前面)
缺少“;”(在“)”的前面)
17楼2013-08-31 20:50:49
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
★ ★
小木虫: 金币+0.5, 给个红包,谢谢回帖
jjdg: 金币+1, 感谢参与 2013-09-01 00:49:16
引用回帖:
17楼: Originally posted by hywC at 2013-08-31 20:50:49
你好,这个程序我在VC2010上创建了一个win32控制台应用程序,但是出现编译错误,请问是什么原因:

for(i=0;i    {  
      c+=a;                  //存储数组元素值的和
      c*=a;                   // ...

那个for循环语句本来就没写全,示意而已。
18楼2013-08-31 22:12:49
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

m57091003

木虫 (著名写手)


★
小木虫: 金币+0.5, 给个红包,谢谢回帖
用引用或者指针

[ ????????? http://muchong.com/3g ]
19楼2013-09-01 02:53:05
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

goldfox_79

金虫 (正式写手)


★
小木虫: 金币+0.5, 给个红包,谢谢回帖
我是这样理解的:函数中的局部变量被存储在栈里。当执行函数时,函数开始使用栈里的某个内存区(比如0x10)来存储你的int a[2]。当函数执行完毕时,操作系统收回0x10对应的内存,根据具体情况分配使用。在0x10区没有被分配使用之前,你仍然可以通过读取这部分区域获得原先在函数执行时存储的数据。但是一旦0x10被分配,其内容会被修改。因此,这段代码是非常危险不靠谱的。
20楼2013-09-01 07:44:50
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
简单回复
2012-07-03 10:54   回复  
相关版块跳转 我要订阅楼主 东山 的主题更新
普通表情 龙 兔 虎 猫 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[硕博家园] 极限拉扯,如何抉择 +11 Isak0320 2026-10-12 15/750 2026-10-14 21:55 by 猫鱼不是鱼
[基金申请] 申请科研项目纯靠实力能成功吗? 200+5 David1982 2026-10-13 8/400 2026-10-14 21:38 by lhw_GPA4.0
[硕博家园] 中科院海洋所招收海洋材料相关领域博士研究生及研究助理 +3 sujiner 2026-10-08 4/200 2026-10-14 20:40 by qicaiyun
[职场人生] 40+中年人失业后,还能找到好工作吗? +3 xqy2009 2026-10-13 3/150 2026-10-14 20:17 by 43358052
[论文投稿] 二审4个多月了还是Awaiting Reviewer Scores 10+3 纳斯达克ML 2026-10-11 4/200 2026-10-14 17:30 by babero
[有机交流] OpenAI又攻克数学难题了,离AI做有机合成还有多远? +8 wangyl_123 2026-10-10 13/650 2026-10-14 15:12 by zuesli
[教师之家] 课题组会帮你通过考核么? +4 好运来~9527 2026-10-10 7/350 2026-10-13 08:41 by xli1984
[基金申请] 入职后第一次管课题组的专利缴费,对账才发现官费比别人多掏了一倍 +6 13108017953 2026-10-08 6/300 2026-10-12 20:07 by w3w3y3
[公派出国] 售SCI一区文章,我:8O5.5.1.O5.4,科目全,可伽急 +5 qR2AdCWTVtkw 2026-10-09 10/500 2026-10-11 22:26 by XQNyDCa1Tk5n
[考博] 售SCI一区T0P文章,我:8.O55.1.O.54,科目全,可十急 +5 qR2AdCWTVtkw 2026-10-09 9/450 2026-10-11 22:15 by XQNyDCa1Tk5n
[考博] 售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急 +3 qR2AdCWTVtkw 2026-10-09 7/350 2026-10-11 22:11 by XQNyDCa1Tk5n
[教师之家] 售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急 (EPI+-1)(金币-50) +5 qR2AdCWTVtkw 2026-10-09 10/500 2026-10-11 22:06 by XQNyDCa1Tk5n
[教师之家] 售SCI一区T0P文章,我:8.O.55.1.O.5.4,科目全,可+急 (EPI+-1)(金币-50) +5 qR2AdCWTVtkw 2026-10-09 10/500 2026-10-11 14:25 by VOMexwnDzOFZ
[考研] 售SCI文章,我:8O.5.5.1O.54,科目全,可十急 +5 qR2AdCWTVtkw 2026-10-09 8/400 2026-10-11 13:51 by VOMexwnDzOFZ
[硕博家园] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +5 qR2AdCWTVtkw 2026-10-09 8/400 2026-10-11 13:45 by VOMexwnDzOFZ
[找工作] 售SCI一区T0P文章,我:8O.55.1.O.5.4,科目齐全,可+急 +4 qR2AdCWTVtkw 2026-10-09 7/350 2026-10-11 10:34 by VOMexwnDzOFZ
[考博] 招收博士生一名 +3 mandolin 2026-10-10 3/150 2026-10-11 10:21 by 不是山谷!
[公派出国] 售SCI一区T0P文章,我:8O.55.1.O.54,科目全,可伽急 +4 qR2AdCWTVtkw 2026-10-09 4/200 2026-10-11 03:14 by M0zrYVSAnxpE
[有机交流] 各位大佬,路线设计求助 +6 zapen 2026-10-08 8/400 2026-10-10 15:59 by zapen
[有机交流] 我应该选哪条合成路线让实验成功率高一些? +5 jing816y 2026-10-08 9/450 2026-10-10 09:05 by zapen
信息提示
请填处理意见