C语言的函数如何返回多个数据

嵌入式技术

1372人已加入

描述

C语言的函数如何返回多个数据?这个操作在写代码的时候还经常遇到。

  先来看个典型的错误,有80%的初学者都会这样写。

  既然要返回多个数据,那么可以把多个数据放在一个数组中,然后直接返回数组名,因为数组名是地址,所以这样的函数我们把它称作指针函数。

int *test()
{
    int arr[5] = {1, 2, 3, 4, 5};
    return arr;
}
  这种写法应该说错的还比较明显,大部分编译器在编译的时候,就会直接提示警告,说返回了局部变量的地址。
root@Turbo:test# gcc test.c -o test
test.c: In function ‘test’:
test.c9: warning: function returns address of local variable [-Wreturn-loca
l-addr]    6 |  return arr;
      |         ^~~
root@Turbo:test#
  原因很简单,因为数组是局部变量,属于栈空间内存,函数运行结束后,会自动释放栈空间的内存,也就是数组这块内存没了,即使调用的函数记住了这个地址,此时也变成了野指针,直接去访问就可能会有未知的错误发生。

  所以切记,不能返回局部变量的地址。
 
想解决这个问题很简单,函数运行结束会释放栈空间,但是堆空间并不在它的管辖范围内。

于是可以在函数内部用malloc申请内存,最后返回这块堆内存的地址。
int *test()
{
    int *p = (int *)malloc(sizeof(int) * 5);
    return p;
}


int main()
{
    int *s = test();
    free(s);
    return 0;
}
  即使函数运行结束,把指针p释放了,但是它指向的内存还在。主函数中,因为接到了test函数的返回值,所以指针s也是个合法的指针,指向test函数中申请的堆内存。

最后用完了记得释放就行。

还有一种办法,既然想返回多个数据,可以把这些数据整合在一个结构体中,返回结构体变量,也算是只有一个返回值,只不过这个变量里面又可以拆分成多个变量。所以也能满足要求。
struct Test
{
    int a;
    int b;
    char c;
};
struct Test test()
{
    struct Test tt;
    return tt;
}
  最后,关于返回多个数据,大家还有没有其他办法,如果你知道,欢迎私信留言。    

 审核编辑:汤梓红

 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分