2014年(11)
分类: 嵌入式
2014-08-28 15:18:20
原文地址: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)。