函数返回数组

本文转自:https://blog.csdn.net/earbao/article/details/53401800

关于C语言函数返回一个数组
c语言中函数不能直接返回一个数组,但是可以用其他方式实现类似功能,不过需要注意:
1、该数组不能是返回函数的局部变量数组,因为局部变量数组在退出函数后会被释放。
可以是全局变量,静态局部变量,动态分配内存,以及从函数参数传过来的数组地址。
2、返回指针时,无法返回长度,所以需要其它方式传回数组长度,以下是几种常用的方法。
1) 约定固定长度;
2) 以函数参数返回数组长度;
3)将长度保存在全局变量中;
4)约定数组结束标记;
5)在数组中存储数组长度,如存在第一个元素中。

有些时候需要子函数将一个数组返回出来,通常是两种方法,一种是靠指针,另一种是结构体。

一、先来看依靠指针怎么做


 
 
  1. #include <stdio.h>
  2. char *test(char *tmp)
  3. {
  4. return tmp;
  5. }
  6. void main(void)
  7. {
  8. printf( "%s",test( "第一个测试例子\n"));
  9. }

二、使用结构体作为返回值来传递数组


 
 
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #ifdef _WIN32
  5. //#include <Windows.h>
  6. #include <vld.h>
  7. #endif
  8. //直接返回指针,但是无法返回长度
  9. char *test(char *tmp)
  10. {
  11. return tmp;
  12. }
  13. //返回数组首地址
  14. char *test2()
  15. {
  16. //char tmp[30]="第一个测试例子\n";//错误写法,写成这样编译时弹出警告,最后的结果也是乱码
  17. char *tmp= "test2 demo"; //写成这样可以用指针返回数组首地址
  18. return tmp;
  19. }
  20. //使用静态全局变量
  21. char *test3()
  22. {
  23. //静态全局变量,但不是线程安全的,在多线程环境中就危险了
  24. static char tmp[ 30]= "third demo test003";
  25. return tmp;
  26. }
  27. //动态分配内存, 调用malloc在堆上分配内存,记得free
  28. int* getArrays(int n)
  29. {
  30. //malloc数组建立在heap堆上,调用完函数还在,返回了那个堆上数组的首地址
  31. int* array = ( int *) malloc( sizeof( int)*n);
  32. int base= 100;
  33. for( int i= 0;i<n;i++)
  34. {
  35. array[i]=base+i; //赋值
  36. }
  37. return array;
  38. }
  39. void showArr(int* arr,int len)
  40. {
  41. for( int i= 0;i<len;i++)
  42. {
  43. printf( "%d ",arr[i]);
  44. }
  45. printf( "\n");
  46. }
  47. //从函数参数传过来的数组地址
  48. int getCharsArray(char* output,int len)
  49. {
  50. strncpy(output, "123456789 from china!",len);
  51. return 0;
  52. }
  53. //动态分配内存
  54. char* getCharsArrayByPoint(int len)
  55. {
  56. //malloc数组建立在heap堆上,调用完函数还在,返回了那个堆上数组的首地址
  57. char* array = ( char *) malloc( sizeof( char)*len+ 1);
  58. memset( array, 0, sizeof( char)*len+ 1);
  59. strncpy( array, "getCharsArrayByPoint from china!",len);
  60. return array;
  61. }
  62. struct ArrayStruct
  63. {
  64. char buf[ 1024];
  65. }; //定义结构体时不要忘了分号
  66. //使用结构体作为返回值来传递数组
  67. struct ArrayStruct byStruct(char *tmp)
  68. {
  69. struct ArrayStruct arr;
  70. strcpy(arr.buf,tmp);
  71. return arr;
  72. }
  73. //关于C语言函数返回数组的问题
  74. int main(int argc, char *argv[])
  75. {
  76. char* line=test( "first test demo\n");
  77. printf( "%s",line);
  78. char* line2=test2();
  79. printf( "%s\n",line2);
  80. char* line3=test3();
  81. printf( "%s\n",line3);
  82. char line4[ 1024]={ 0};
  83. getCharsArray(line4, sizeof(line4));
  84. printf( "%s\n",line4);
  85. char *line5=getCharsArrayByPoint( 150);
  86. printf( "%s\n",line5);
  87. free(line5);
  88. struct ArrayStruct arrStruct;
  89. arrStruct=byStruct( "byStruct"); //用结构体作为返回值传递数组
  90. printf( "%s\n",arrStruct.buf);
  91. #define arrLen 10
  92. int* arr=getArrays(arrLen);
  93. showArr(arr,arrLen);
  94. free(arr); //和malloc配对
  95. return 0;
  96. }

两点注意:

1、数组之间的赋值不要直接,即不要直接将数组A赋给数组B,而是要用strcpy(字符型数组)或者memcpy(非字符型数组)。

2、用结构体定义变量和函数时不要忘了结构体名。







  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值