在函数内部的声明中初始化数组,并在外部使用它

Initializing an array in declaration inside the function and using this outside

本文关键字:外部 初始化 内部 函数 声明 数组      更新时间:2023-10-16

我想在函数中轻松初始化一个数组:

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();
}

使arr[]静态:

void f()
{
static int arr[]{1, 2, 3};
n = sizeof(arr) / sizeof(*arr);
g_arr = arr;
}

一个可能的解决方案是复制堆栈分配的数组:

#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();
}