Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在函数内部的声明中初始化数组并在外部使用_C++_Arrays_Pointers - Fatal编程技术网

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

C++ 在函数内部的声明中初始化数组并在外部使用,c++,arrays,pointers,C++,Arrays,Pointers,我想轻松初始化函数中的数组: int-arr[]{1,2,3}; 它简化了阵列大小的计算: int n=sizeofar/sizeof*arr; 但是,我需要保留这个数组,并在函数外部访问它 如何做到这一点 首先,我有以下几点: 包括 使用名称空间std; int n{0}; int*g_arr{nullptr}; 空f { int-arr[]{1,2,3}; n=sizeofar/sizeof*arr; g_arr=arr;//不能在此函数之外使用g_arr值,因为arr将被释放。 } 空b

我想轻松初始化函数中的数组:

int-arr[]{1,2,3}; 它简化了阵列大小的计算:

int n=sizeofar/sizeof*arr; 但是,我需要保留这个数组,并在函数外部访问它

如何做到这一点

首先,我有以下几点:

包括 使用名称空间std; int n{0}; int*g_arr{nullptr}; 空f { int-arr[]{1,2,3}; n=sizeofar/sizeof*arr; g_arr=arr;//不能在此函数之外使用g_arr值,因为arr将被释放。 } 空b {
cout一种可能的解决方案是复制堆栈分配的数组:

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

一种可能的解决方案是复制堆栈分配的阵列:

#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();
}
使arr[]为静态:

空f { 静态int-arr[]{1,2,3}; n=sizeofar/sizeof*arr; g_arr=arr; } 使arr[]为静态:

空f { 静态int-arr[]{1,2,3}; n=sizeofar/sizeof*arr; g_arr=arr; }
你可以用int g_arr[3];在文件范围内,并在f@M.M在我的情况下不是。我需要它在函数中。在您发布的代码中,函数中不需要arr。事实上,当f返回时,它不再存在。如果您有其他要求,则需要详细说明them@M.M好吧,我需要我所需要的。解释为什么会很冗长。它导致使用PROGMEM进行嵌入式编程和备用SRAM。您需要尝试一下。当函数返回时,问题中的本地数组将停止存在。如果您试图说您通过其他方式创建了数组,那么显然这与问题有关。否则,我们只会遇到无休止的人建议你回答说哦,那对我不起作用你可以有int g_arr[3];在文件范围内,并在f@M.M在我的情况下不是。我需要它在函数中。在您发布的代码中,函数中不需要arr。事实上,当f返回时,它不再存在。如果您有其他要求,则需要详细说明them@M.M好吧,我需要我所需要的。解释为什么会很冗长。它导致使用PROGMEM进行嵌入式编程和备用SRAM。您需要尝试一下。当函数返回时,问题中的本地数组将停止存在。如果您试图说您通过其他方式创建了数组,那么显然这与问题有关。否则,我们只会遇到无休止的人建议答案是,你说哦,这对我不起作用。不幸的是,我不能使用vector。模板库在我的环境中不可用,它浪费了很多SRAM。你能动态分配arr吗?我能。但是我会失去使用[]{…}的便利。@zhekaus考虑[]{…}这对你来说非常重要,我更新了答案在第一种情况下你可以使用unique_ptr而不是原始拥有点。不幸的是,我不能使用vector。模板库在我的环境中不可用,它浪费了大量SRAM。你能动态分配arr吗?我能。但是我会失去使用[]{…}的便利。@zhekaus[]{…}对您来说非常重要,我更新了答案在第一种情况下,您可以使用unique_ptr而不是原始指针