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

article/2025/10/3 14:07:09

最近在通过函数返回数组时踩到了一些坑,在此记录一下。

首先C++函数的返回类型没有“数组”这一结构,因此一般情况下我们会采用指针去接受数组的首地址来进行返回。另外由于函数体内定义的变量均为局部变量,局部变量被存储在栈区会在函数调用完毕之后被系统回收,因此,如果我们采用地址传递的方式返回局部变量时就会出现问题:该指针指向的变量值因为在函数被调用结束后被系统收回已经不存在了。

#include <iostream>
using namespace std;int* func1()
{int p = 10;return &p;
}int* func2()
{int* p = new int(10);return p;
}int main()
{int *p1 = func1();cout << *p1 << endl;cout << *p1 << endl;/*int* p2 = func2();cout << *p2 << endl;cout << *p2 << endl;*/system("pause");return 0;
}

在这里插入图片描述

可以发现当存储在栈区的变量的地址作为函数的返回值然后做打印输出时,第一次打印的结果是正确的,但是第二次打印的结果是一串奇怪的数字而不是想要的结果:10,这是因为在第二次打印输出时,C++已经回收了该局部变量,原先的地址中存储的值已经不再是10。因此如果希望返回变量的地址,应该将该变量开辟在堆区。使用func2()函数的得到的结果如下图所示。
在这里插入图片描述
再回到数组的问题上来,数组名不就是一个数组的首地址吗,只要返回首地址就能够愉快用指针来遍历数组了,并且数组名退化的指针也能够通过“[]”的方式来遍历数组了。代码如下所示。

#include <iostream>
using namespace std;int* getArrary()
{int* arr = new int[10];for (int i = 0; i < 10; i++){int a = rand() % 10;arr[i] = a;}return arr;
}int main()
{int* p = getArrary();for (int i = 0; i < 10; i++){cout << p[i] << " ";}system("pause");return 0;
}

在这里插入图片描述
到此为止,数组已经被成功的传递并在main()函数中输出了。但是这样的代码仍然存在问题:在使用for循环遍历数组的时候,数组长度是我们自己输入的,那当我们未知数组长度时应该如何进行遍历呢?

那不简单嘛?直接sizeof(arr)/sizeof(arr[0])不就就能得到数组长度。但是我们将数组从函数中取出时用的指针去接收的数组的首地址,也就是说我们返回数组时,数组名已经退化为了指针,这时候返回的指针的大小是固定的4字节(32位编译系统),而不是对应数组所占的空间大小,这么做肯定是有问题的。

那么如何解决这个问题呢?一种办法是不使用sizeof()来得到数组的大小,而是通过自己写的函数来获取。另一种办法是,我们在传递指针的同时返回数组的大小,以返回结构体或者类的方式同时返回指针和数组长度。代码如下所示。

#include <iostream>
using namespace std;struct prtArrary
{int* p;int len;
};prtArrary getArrary()
{int* arr = new int[10];for (int i = 0; i < 10; i++){int a = rand() % 10;arr[i] = a;}int len = 10;prtArrary prtA;prtA.len = len;prtA.p = arr;return prtA;
}int main()
{prtArrary prtA = getArrary();for (int i = 0; i < prtA.len; i++){cout << prtA.p[i] << " ";}delete[] prtA.p;system("pause");return 0;
}

总结一下,在处理数组作为返回值时,应当注意一下几点:

  1. 采用指针接收数组首地址的方式返回。
  2. 因为返回的是局部变量的地址,因此数组应开辟在堆区以避免被系统回收。
  3. 返回值除了包含指针,还应该包含数组长度。(sizeof(指向首地址的指针)=4而不是数组大小)。

http://chatgpt.dhexx.cn/article/KRRP3jDT.shtml

相关文章

c++ 函数返回数组

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

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

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

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

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

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

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

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

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

DKMS:Dynamic Kernel Module Support

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

DKMS(大开门是什么意思)

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

DKMS是什么?

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

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

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

DKMS简介

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

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

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

接口幂等性的理解

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

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

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

接口幂等性校验

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

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

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

接口的幂等性怎么设计?

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

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

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

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

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

接口幂等性测试

前言 所谓幂等: 多次调用方法或者接口不会改变业务状态&#xff0c;可以保证重复调用的结果和单次调用的结果一致。 我们在开发中主要操作也就是CURD,其中读取操作和删除操作是天然幂等的&#xff0c;我们所关心的就是创建操作、更新操作。 创建操作一定是非幂等的因为要涉及到…

接口幂等性是什么?如何设计?

接口幂等 什么是接口幂等&#xff1f;为什么接口需要幂等性设计前端重复提交表单黑客恶意攻击接口超时重复提交消息重复消费 哪些接口需要幂等&#xff1f;如何实现幂等前端拦截数据库唯一索引实现数据库乐观锁实现数据库悲观锁实现JVM锁实现分布式锁实现Token实现 总结 接口幂…