从函数返回指针

时间:2019-07-11 20:39:06

标签: c++ pointers

为什么此代码不起作用? 我已经通过传递指向函数的指针找到了解决方法,但是我想知道是否有更简单的解决方案?

#include <stdio.h>

int* func() {
        int d[3];
        for (int f = 0; f < 3; f++)
                d[f] = 42;
        return d;
}


int main() {
        int* dptr;
        dptr = func();

        printf("Hi\n");

        for (int f = 0; f < 3; f++)
                 printf("%d\n",dptr[f]);
        return 0;
}

2 个答案:

答案 0 :(得分:3)

使用return d;,您将返回一个指向局部变量的指针,即函数d完成后,数组func的生存时间将结束。之后(通过返回的指针)访问此数组是未定义的行为。

一种简单的解决方案是将d设置为static变量,这样其寿命将一直持续到程序结束:

int* func() {
    static int d[3];

但是请注意,此变量d在程序中将仅存在一次,因此一个调用的结果以后可能会更改。考虑使用std::vector<int>作为返回类型或将要更改的数组作为函数参数void func(int[] d) {

传递

答案 1 :(得分:3)

最简单的解决方法是使用std :: array(这是首选方法)

#include <array>

std::array<int, 3> do_something() {
   std::array<int, 3> arr = {1, 2, 3};
   return arr;
}

int main() {
    do_something()[0];
}

关于此的最佳部分是编译器将就地构建此结构,这意味着不会因复制而损失性能。