原创 关于C语言返回数组的若干问题

2009-4-19 09:50 4324 3 3 分类: 软件与OS

      昨儿有同学问我,怎么在不用全局数组的情况下调用另一个函数的数组,当时我就没想明白,以前也没注意到这个问题,最后还是查了一些资料才明白过来,总结如下:


     如果你有这个想法,可以告诉你已经走入了一个误区,你可以返回一个数,指针,甚至结构,但是就是不能返回一个数组。数组其实是一个基本类型和大小动态可知的一块连续的内存空间(如其定义int buff[10],当然还可以使用mallco),是不能在函数间传递的。


     那怎么来传递?在C语言中一般都是传递简单的数值类型,而传到大的对象比如数组,union,struct,基本上有一个原则就是:调用者负责提供内存,而被调用者负责填写内容。举一个简单的例子:


#include <stdio.h>


int sun(int *a)
{
 int i;
 for(i=0;i<2;i++)
  a*=3;
  return *a;
}
main()
{
 int i, a[]={1,2};
  sun(a);
 for(i=0;i<2;i++)
 printf("a[%d]:%d\n",i,a);
}


不过如果在编译期大小可知的话还是有一种方法,不过也只不过是每次传递都是COPY,并不能算是整个数组的真正返回。举例如下:


#include <stdio.h>
#include <stdlib.h>


#define array_size 10
typedef struct array array;
struct array{


 int val[array_size];
};
array f()
{
 array va={0,1,2,3,4,5,6,7,8,9};
 return va;
}
main()
{
 array a;
 int i;
 a=f();
 for(i=0;i<10;i++)
 printf("%d",a.val);
}


  最后,如果你真的想要数组的返回,建议使用其他语言。。

文章评论0条评论)

登录后参与讨论
相关推荐阅读
kuangjuan 2009-08-06 16:52
CRC16总结
CRC码是由两部分组成,前部分是信息码,就是需要校验的信息,后部分是校验码,如果CRC码共长n个bit,信息码长k个bit,就称为(n,k)码。 它的编码规则是:  1、首先将原信息码(kbit)左移...
kuangjuan 2009-05-31 22:54
我的毕业答辩
今天完成了我的毕业答辩,终于毕业了,彻底的结束了我的学生时代了,传一些照片记住这个时刻...
kuangjuan 2009-04-23 17:26
动态LED点阵显示屏(最详细的资料)
        此LED点阵显示屏是基于51单片,用595驱动,138级联扫描的,由于此类的资料网上很多,但是都没有一个拥有很详尽的说明,所以本人结合自己的实践以及整个测试的过程,给出整个代码详细的解...
kuangjuan 2009-04-21 10:42
关于linux下minicom的若干问题
大家都知道关于ARM开发板终端调试运行在Windows下采用超级终端,而在Linux下用minicom,下面我们就来探讨一下关于minicom的相关问题。  第一:就是配置问题,我们可以在Linux终...
kuangjuan 2009-04-20 19:39
linux中的mount命令总结
1、从光盘制作光盘镜像文件。将光盘放入光驱,执行下面的命令。    #cp /dev/cdrom /home/sungc/mydisk.iso 或    #dd if="/dev/cdrom" of=...
广告
我要评论
0
3
1
2
3
4
5
6
7
8
9
0
广告
关闭 热点推荐上一条 /5 下一条