C/C++语言自定义函数如何返回数组?

此类问题,应用场景往往为了解决函数间相互通信,比如某个函数内处理的完的结果数据需要交接给另一个函数的情况,那么一般来说,总结有以下三种:

直接使用全局变量:这种方法最方便,但此方法打破了函数间的通信及封装的思想,所以不推荐使用;
通过堆区动态开辟内存解决:C语言中,通常用malloc来在堆区动态开辟内存,利用堆区“现用现开辟,用完手动收回”特点,实现灵活管理;
由调用方传入数组指针:此种方法不需要函数返回地址,而是在调用时直接 传入数组地址,委托被调用方进行操作,由于此局部变量属于调用方本身,故即便被调用方结束内存释放,也不会被影响到该数组。
使用智能指针;

对于第二种方法,由于动态开辟内存在堆区,堆区不像中局部变量在栈区存储,系统根据它的生命周期自动收回,而是手动开辟,手动释放,这样就可以完全规避问题,例子与效果见下图:

需要注意的是:记得用完free掉,防止内存泄露!

#include"stdio.h"
#include<stdlib.h>
int *fun() {
    int *num;
    num = (int *)malloc(3);
    num[0] = 1;
    num[1] = 2;
    num[2] = 3;
    return num;
}
int main()
{ 
    int *num;
    num = fun();
    for (int i = 0; i < 3; i++) {
        printf("%d", num[i]);
    }
    free(num);
    return 0;
}

输出为“123”
第三种方法:虽然没有在函数中返回数组,但也可以解决数组通信问题,主要思路就是调用方中定义数组,然后将地址传入,由于该内存属于调用方,而非被调用方,故被调用方在调用结束后释放掉内存也无所谓。例子程序及效果如下:

int *fun(int *num) {
    num[0] = 1;
    num[1] = 2;
    num[2] = 3;
    return num;
}
int main() {
    int num[3];
    fun(num);
    for (int i = 0; i < 3; i++) {
        printf("%d", num[i]);
    }
    return 0;
}

输出:“123”

第四种方法:使用智能指针

#include<stdio.h>
#include <memory>
std::unique_ptr<int[]> func(int n) {
    std::unique_ptr<int[]> arr(new int[n]);
    for (int i = 0; i < n; i++) {
        arr.get()[i] = 123;
    }
    return arr;
}
int _tmain(int argc, _TCHAR* argv[])
{
    std::unique_ptr<int[]> ret = func(10);

    for (int i = 0; i < 10; i++) {
        std::cout << ret.get()[i] << ' ';
    }
    return 0;
}
  • 10
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值