关于C语言函数返回一个数组

c语言中函数不能直接返回一个数组,但是可以用其他方式实现类似功能,不过需要注意:

1、该数组不能是返回函数的局部变量数组,因为局部变量数组在退出函数后会被释放。

可以是全局变量,静态局部变量,动态分配内存,以及从函数参数传过来的数组地址。

2、返回指针时,无法返回长度,所以需要其它方式传回数组长度,以下是几种常用的方法。

1) 约定固定长度;

2) 以函数参数返回数组长度;

3)将长度保存在全局变量中;

4)约定数组结束标记;

5)在数组中存储数组长度,如存在第一个元素中。

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

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

#include

char *test(char *tmp)

{

return tmp;

}

void main(void)

{

printf("%s",test("第一个测试例子\n"));

}

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

#include

#include

#include

#ifdef _WIN32

//#include

#include

#endif

//直接返回指针,但是无法返回长度

char *test(char *tmp)

{

return tmp;

}

//返回数组首地址

char *test2()

{

//char tmp[30]="第一个测试例子\n";//错误写法,写成这样编译时弹出警告,最后的结果也是乱码

char *tmp="test2 demo";//写成这样可以用指针返回数组首地址

return tmp;

}

//使用静态全局变量

char *test3()

{

//静态全局变量,但不是线程安全的,在多线程环境中就危险了

static char tmp[30]="third demo test003";

return tmp;

}

//动态分配内存, 调用malloc在堆上分配内存,记得free

int* getArrays(int n)

{

//malloc数组建立在heap堆上,调用完函数还在,返回了那个堆上数组的首地址

int* array = (int *)malloc(sizeof(int)*n);

int base=100;

for(int i=0;i

{

array[i]=base+i;//赋值

}

return array;

}

void showArr(int* arr,int len)

{

for(int i=0;i

{

printf("%d ",arr[i]);

}

printf("\n");

}

//从函数参数传过来的数组地址

int getCharsArray(char* output,int len)

{

strncpy(output,"123456789 from china!",len);

return 0;

}

//动态分配内存

char* getCharsArrayByPoint(int len)

{

//malloc数组建立在heap堆上,调用完函数还在,返回了那个堆上数组的首地址

char* array = (char *)malloc(sizeof(char)*len+1);

memset(array,0,sizeof(char)*len+1);

strncpy(array,"getCharsArrayByPoint from china!",len);

return array;

}

struct ArrayStruct

{

char buf[1024];

};//定义结构体时不要忘了分号

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

struct ArrayStruct byStruct(char *tmp)

{

struct ArrayStruct arr;

strcpy(arr.buf,tmp);

return arr;

}

//关于C语言函数返回数组的问题

int main(int argc, char *argv[])

{

char* line=test("first test demo\n");

printf("%s",line);

char* line2=test2();

printf("%s\n",line2);

char* line3=test3();

printf("%s\n",line3);

char line4[1024]={0};

getCharsArray(line4,sizeof(line4));

printf("%s\n",line4);

char *line5=getCharsArrayByPoint(150);

printf("%s\n",line5);

free(line5);

struct ArrayStruct arrStruct;

arrStruct=byStruct("byStruct");//用结构体作为返回值传递数组

printf("%s\n",arrStruct.buf);

#define arrLen 10

int* arr=getArrays(arrLen);

showArr(arr,arrLen);

free(arr);//和malloc配对

return 0;

}

两点注意:

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

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

c语言在函数中返回数组,关于C语言函数返回数组的问题相关推荐

  1. C语言试题四十七之程序定义了N×M的二维数组,并在主函数中自动赋值。请编写函数function(int a[N][M], int m),该函数的功能是:将数组右上半三角元素中的值乘以m。

    1. 题目 程序定义了N×M的二维数组,并在主函数中自动赋值.请编写函数function(int a[N][M], int m),该函数的功能是:将数组右上半三角元素中的值乘以m. 2 .温馨提示 C ...

  2. C语言编程>第十一周 ⑥ 某学生的记录由学号、5门课程成绩和平均分组成,学号和5门课程的成绩已在主函数中给出。请编写函数fun,它的功能是:求出该学生的平均分,并放在记录的ave成员中。

    例题:某学生的记录由学号.5门课程成绩和平均分组成,学号和5门课程的成绩已在主函数中给出.请编写函数fun,它的功能是:求出该学生的平均分,并放在记录的ave成员中.请自己定义正确的形参.. 例如,若 ...

  3. 算法训练 - P1101 ——有一份提货单,其数据项目有:商品名(MC)、单价(DJ)、数量(SL)。定义一个结构体prut,其成员是上面的三项数据。在主函数中定义一个prut类型的结构体数组,输入每

    问题描述 有一份提货单,其数据项目有:商品名(MC).单价(DJ).数量(SL).定义一个结构体prut,其成员是上面的三项数据.在主函数中定义一个prut类型的结构体数组,输入每个元素的值,计算并输 ...

  4. 输入10个学生某门课的成绩,用函数找出最高分、最低分,计算平均分,并在主函数中输入和输出(用函数和全局变量来完成)(C语言)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 题目: 输入10个学生某门课的成绩,用函数找出最高分.最低分,计算平均分,并在主函数中输入和输出(用函数和全局变量来完成). 代码: ...

  5. 【Android 逆向】函数拦截原理 ( 通过修改 GOT 全局偏移表拦截函数 | 通过在实际被调用的函数中添加跳转代码实现函数拦截 )

    文章目录 一.通过修改 GOT 全局偏移表拦截函数 二.通过在实际被调用的函数中添加跳转代码实现函数拦截 一.通过修改 GOT 全局偏移表拦截函数 使用 GOT 全局偏移表 拦截函数 , 只需要将 G ...

  6. DSB算法C语言程序,单片机中使用DSB温度传感器C语言程序.doc

    单片机中使用DSB温度传感器C语言程序 单片机中使用DS18B20温度传感器C语言程序(参考1) /************************************************** ...

  7. 习题 8.21 用指向指针的指针的方法对n个整数排序并输出。要求将排序单独写成一个函数。n个整数在主函数中输入,最后在主函数中输出。

    C程序设计(第四版) 谭浩强 习题8.21 个人设计 习题 8.21 用指向指针的指针的方法对n个整数排序并输出.要求将排序单独写成一个函数.n个整数在主函数中输入,最后在主函数中输出. 代码块: 方 ...

  8. 37.某学生的记录由学号、8门课程成绩和平均分组成,学号和8门课程的成绩已在主函数中给出。请编写函数fun,它的功能是:求出该学生的平均分放在记录的ave成员中。请自己定义正确的形参。

    37.某学生的记录由学号.8门课程成绩和平均分组成,学号和8门课程的成绩已在主函数中给出.请编写函数fun,它的功能是:求出该学生的平均分放在记录的ave成员中.请自己定义正确的形参. 例如,若学生的 ...

  9. 某学生的记录由学号、5门课程成绩和平均分组成,学号和5门课程的成绩已在主函数中给出。请编写函数fun,它的功能是:求出该学生的平均分,并放在记录的ave成员中。

    例题:某学生的记录由学号.5门课程成绩和平均分组成,学号和5门课程的成绩已在主函数中给出.请编写函数fun,它的功能是:求出该学生的平均分,并放在记录的ave成员中.请自己定义正确的形参.. 例如,若 ...

  10. 习题 6.20 用指向指针的指针的方法对n个整数排序并输出。要求将排序单独写成一个函数。整数和n在主函数中输入。最后在主函数中输出。

    C++程序设计(第三版) 谭浩强 习题6.20 个人设计 习题 6.20 用指向指针的指针的方法对n个整数排序并输出.要求将排序单独写成一个函数.整数和n在主函数中输入.最后在主函数中输出. 代码块: ...

最新文章

  1. R语言ggplot2可视化:通过水平半小提琴图(Horizontal Half Violin Plots)和抖动数据点( jittered data)可视化雨云图(Rain Cloud plots)
  2. iPhoneX设计稿适配Android,UI设计干货:关于IPHONE X适配问题
  3. 如何注册域名-买服务器-备案-建设网站
  4. c++新特性11 (12)weak_ptr类定义
  5. 【openCV学习笔记】在Mac上配置openCV步骤详解
  6. shell 中的 set命令 -e -o 选项作用
  7. hadoop的开发工具_Hadoop开发工具简介
  8. 奇闻异事之NoSuchMethodError
  9. 开源运维管理软件排名_企业运维监控平台架构设计与实现(ganglia篇)
  10. 拓端tecdat|R语言使用马尔可夫链对营销中的渠道归因建模
  11. 微信小程序中的倒计时
  12. 计算机的acpi高级电源选项配置,ACPI电源管理模式详解
  13. linux编译mmplay,mplay编译与移植
  14. day9Python操作Excel
  15. 安卓开发贴吧!Android高级工程师必看系列,建议收藏
  16. 阿里云Nginx配置站点403Forbidden问题
  17. 我喜欢的画家傅志伟先生的油画作品发几张来给大家一起欣赏
  18. matlab 函数不定参数,matlab function定义一个函数,但一直出来说输入参数数目不足。我用的是2014版本,不知道数目原因啊?...
  19. 办公计算机应用常用软件,办公自动化及常用工具软件
  20. mac工具-解析json

热门文章

  1. webots学习笔记
  2. 数据仓库之电商数仓-- 5、即席查询Kylin
  3. 目标检测—查全率和查准率Python代码实现
  4. 欧几里得原理及扩展欧几里得原理(Euclidean Theory and Extended Euclidean Theory)学习笔记
  5. miaov- 自动生成正V反V大于号V小于号V楼梯等图案
  6. 账龄分析Vintage
  7. 2.5 浮点数的表示及运算(浮点数乘除运算)
  8. 自定义view的简单使用
  9. Oracle查询表空间的每日增长量
  10. jQuery之过关小游戏