• 【原】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)。

  • 相关阅读:
    Android studio 搭建测试环境 创建虚拟机
    Halcon算子翻译——break
    Halcon算子翻译——throw
    halcon算子翻译——stop
    halcon算子翻译——return
    halcon算子翻译——par_join
    Halcon算子翻译——import
    Halcon算子翻译——global
    Halcon算子翻译——export_def
    Halcon算子翻译——exit
  • 原文地址:https://www.cnblogs.com/wuqi1003/p/2853657.html
Copyright © 2020-2023  润新知