C语言中如何达到函数返回值为数组的效果?

clipboard.png

我的myFunc返回值为a数组的首地址,我想用r来接收函数返回值,然后在外界可以用利用r[×]的方式调取到。有没有方法能实现?

阅读 6.6k
2 个回答

数组名实际上就是指针,因此返回数组就是返回一个指针。但有一点要特别注意的是:不要返回指向局部变量的指针或引用
局部变量的生命周期仅限于定义它的函数作用域内,离开函数局部变量就无效了,此时再通过指针访问该变量将导致不可预知的结果。你的myFunc()函数返回的就是一个指向局部数组a的指针,因此这个程序执行的结果是未知的,可能正常输出a中的元素,可能输出垃圾值,或者程序可能因访问了非法地址而崩溃。
通常解决这个问题的方式有两种:
1.将a声明为静态的

int* myFunc() {
    static int a[] = {1, 2, 3};
    return a;
}

静态局部变量保存在全局区中,它的生命周期和进程一致,并不会因函数myFunc()结束而消亡。
2.使用malloc()动态分配内存

#include<stdlib.h>

int* myFunc() {
    int *a = (int*)malloc(sizeof(int)*3);
    a[0] = 1;
    a[1] = 2;
    a[2] = 3;
    return a;
}

malloc()函数分配的内存位于堆上而不是函数栈中,其中的数据同样不受函数生命周期的影响。
但要注意使用malloc()分配的内存并不会被系统自动回收,需要对应使用free()来回收内存,否则将导致内存泄露。

指针和数组是等同的,数组可以视为一个指针的常量。你上面的写法是错的,但可以编译通过。因为a是自动变量,其数组的内存空间分配在堆栈中,方法退出之后自动变量的所有内存都会被释放,a也会被释放。这样的代码会破坏内存。

c的写法应该是

int * myFunc(){

return malloc(3*sizeof(int));

}

c++可以这样写:

return new int[3]{1,2,3};

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题