子函数返回数组(指针和结构体)

article/2025/10/3 13:44:36

一般用void的话就是没有返回值和不需要返回值的了,如调用一个输出函数,这个函数就没必要返回了,事实上这个函数只管输出就好了,也没有什么值要返回的,另一种是用指针传址的时候,因为你传的是地址,函数根据你的地址直接对数据进行操作了,这是就不需要返回值了。
因为对数据的操作在函数里已经进行了(返回值的作用一般是赋值或者作为参数赋值。用指针操作,也可以把返回值赋值给变量)


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

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

例程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)。




http://chatgpt.dhexx.cn/article/8KUToqby.shtml

相关文章

c++函数返回数组类型

c函数返回数组类型 首先,C 不允许返回一个完整的数组作为函数的参数。但是,可以通过指定不带索引的数组名来返回一个指向数组的指针。C 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。 方法一:将返回值定义…

C++ 函数返回数组处理方法

最近在通过函数返回数组时踩到了一些坑,在此记录一下。 首先C函数的返回类型没有“数组”这一结构,因此一般情况下我们会采用指针去接受数组的首地址来进行返回。另外由于函数体内定义的变量均为局部变量,局部变量被存储在栈区会在函数调用完…

c++ 函数返回数组

以下转自:http://blog.csdn.net/lijiayu2015/article/details/52821562 C中函数是不能直接返回一个数组的,但是数组其实就是指针,所以可以让函数返回指针来实现。 不能直接返回函数中定义的数组,会被释放掉 float* add(a[3],b[3]…

C++如何让函数返回数组

C如何返回数组 1.前言指针与指针变量的区分背景 2.正文第一次(❌)第二次(✔)优化vector 方法 3.总结4.更新日志 1.前言 指针与指针变量的区分 int x5; &x //这是指针 变量x的地址叫做它的指针 int * tem…

函数的返回值——数组返回

在C语言中,首先来对函数的返回值来温习一下: 函数调用使主调函数得到一个确定的值,这就是函数的返回值。函数的返回值是通过return 语句获得的。 那我们来提一个这样的问题,如果是一个数组通过排序后,得到了一个新的…

深度学习环境搭建之三_离线安装无线网卡、DKMS

2020.12.08更新:最近又离线装了一次Ubuntu系统。这次离线安装DKMS会报错,没有gcc、make;网上看了一下,gcc离线安装很麻烦,总得来看,还是放弃离线安装Ubuntu吧,联网后安装难度下降99% 【上次难道…

解决一例Fedora 31安装NVIDIA官方驱动程序无法使用DKMS注册的问题

更新: If Not True Then False提供了一份Patch后的340.108版驱动,直接使用此版驱动安装包不会遇到DKMS报错,升级5.5内核时也没有问题,点击进入下载页面。 手头一台Dell D630的本本,虽然已经10年以上寿命,拿…

DKMS:Dynamic Kernel Module Support

DKMS简介 DKMS全称是Dynamic Kernel Module Support,它可以帮我们维护内核外的驱动程序,在内核版本变动之后可以自动重新生成新的模块。 1.背景 对于没有内核编程经验的使用者来说,使用者可能经常困惑:为什么更新操作系统之后,原来用的好好的…

DKMS(大开门是什么意思)

ZS,DZ,DKMS玩了很久了,RAIDJJC也玩了不少了,现 盗贼刚刚又被加强了.其实无论什么职业竞争,都是靠人脉和职业本身无关,刚开TBC的时候DZ下副本没人要.我们亲友团的DZ跟我们一路走来,一个副本也没拉下.所以固定亲友团才是王道.选择自己喜欢的职业,别光顾着好拿装备. 商…

DKMS是什么?

我们都知道,如果要使用没有集成到内核之中的Linux驱动程序需要手动编译。当然,这并不是一件什么难事,即使是对于没有编程经验的Linux使用者,只要稍微有点hacker的意识,努力看看代码包里的Readme或者INSTALL文件&#x…

深度linux安装dkms,安装Virtualbox 错误提示安装DKMS解决方法

玩蛇网推荐图文教程:python 列表 安装Virtualbox 错误提示安装DKMS解决方法。在open 12.3安装Virtualbox出错了,最开始提示什么安装DKMS,然后下载安装后出现如图的错误。Failed, trying without DKMS让人头疼。 下面把错误提示图和提示贴出来了 sincerefly@linux-eq1f:~/Dow…

DKMS简介

我们都知道,如果要使用没有集成到内核之中的Linux驱动程序需要手动编译。当然,这并不是一件什么难事,即使是对于没有编程经验的Linux使用者,只要稍微有点hacker的意识,努力看看代码包里的Readme或者INSTALL文件&#x…

如何解决接口幂等性问题?

什么是幂等性? 参考地址:解决幂等问题 概念: 一个接口,不管我调多少次,只要参数不变,结果也应该不变。 但是在实际工作中,幂等性一般分为两种: 请求幂等:每次请求&…

接口幂等性的理解

一. 什么是接口幂等性 幂等性原本是数学上的概念,用在接口上就可以理解为:同一个接口,多次发出同一个请求,必须保证操作只执行一次。它是系统服务对外的一种承诺(注意不是一种实现),接口服务提…

什么是接口幂等性?为什么会产生接口幂等性问题?如何保证接口幂等性?

博主负责的项目报了一个问题,用户操作回退失效。我们的设计里,操作回退是回到操作前的状态。经过查看日志发现,用户之前的操作做了两次,也就是说提交操作的接口被调用了两次,导致之用户上一次的状态和这一次的状态是一…

接口幂等性校验

接口幂等性校验 一、概念 幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。 在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指…

接口幂等性这么重要,它是什么?怎么实现?

什么是幂等性? 对于同一笔业务操作,不管调用多少次,得到的结果都是一样的。 幂等性设计 我们以对接支付宝充值为例,来分析支付回调接口如何设计? 如果我们系统中对接过支付宝充值功能的,我们需要给支付宝…

接口的幂等性怎么设计?

自己最近负责的几个接口,都涉及到了幂等性的操作,抽空总结了一下,这也是面试官比较爱问的问题。 一、什么是幂等? 看一下维基百科怎么说的: 幂等性:多次调用方法或者接口不会改变业务状态,可以…

java中接口幂等性解决方案总结

一、概念 一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变…

高并发下接口幂等性解决方案

一、背景 我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。 例如1. 前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果;2. 我们发起一笔付款请求,应该只扣用户…