Инициализация массива в объявлении внутри функции и использование его снаружи - PullRequest
1 голос
/ 23 февраля 2020

Я хотел бы легко инициализировать массив внутри функции:

    int arr[]{1, 2, 3};

Это упрощает вычисление размера массива:

    int n  = sizeof(arr) / sizeof(*arr);

Однако мне нужен этот массив для быть сохраненным и быть доступным вне функции.

Как это сделать?

Для начала у меня есть это:


    #include <iostream>

    using namespace std;

    int n{0};
    int* g_arr{nullptr};

    void f()
    {
        int arr[]{1, 2, 3};

        n = sizeof(arr) / sizeof(*arr);
        g_arr = arr; // you can't use g_arr value outside this function, since arr will be freed.
    }

    void b()
    {
        cout << n;

        for (int i = 0; i < n; ++i)
        {
            cout << g_arr[i] << endl; // this is still wrong
        }
    }

    int main()
    {
        f();
        b();
    }

Ответы [ 2 ]

2 голосов
/ 23 февраля 2020

Make arr [] stati c:

 void f()
 {
    static int arr[]{1, 2, 3};

    n = sizeof(arr) / sizeof(*arr);
    g_arr = arr;
 }
1 голос
/ 23 февраля 2020

Возможным решением является копирование выделенного массива стека:

#include <iostream>
#include <cstring>

int* g_arr = nullptr;
std::size_t n = 0;

void f() {
  int arr[]{1, 2, 3};

  n = sizeof(arr) / sizeof(*arr);

  delete[] g_arr;
  g_arr = new int[n];
  std::memcpy(g_arr, arr, sizeof(arr));
}

void b() {
  std::cout << n << '\n';

  for (std::size_t i = 0; i != n; ++i) {
    std::cout << g_arr[i] << '\n';
  }
}

int main() {
  f();
  b();
}

Если вы можете, используйте вектор:

#include <iostream>
#include <vector>

std::vector<int> g_arr{};

void f() {
  g_arr = {1, 2, 3};  
}

void b() {
  std::cout << g_arr.size() << '\n';

  for (int const i : g_arr) {
    std::cout << i << '\n';
  }
}

int main() {
  f();
  b();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...