如何在C或c++中初始化全局数组

How can I initialize an array globally in C or C++?

本文关键字:初始化 全局 数组 c++      更新时间:2023-10-16

我正在尝试这样做:

for(int k=0; k<context.size(); k++)
{
   cc_no_issue[k]=0;
}

谁能告诉我如何在全球范围内做到这一点?每当我尝试,我得到这些错误:

预期的非限定id在"for"前
K没有定义类型
K没有定义类型

这样做:

long cc_no_issue[100]={0};

这是正确的初始化。

注意:这将初始化所有内容为0。

这句话:

long cc_no_issue[100]={1,2};

将设置cc_no_issue[0]为1,cc_no_issue[1]为2,其余为0。您可以查看上面的链接了解更多信息

如果你有一个基本类型的全局数组,

int some_array[1000];

将自动初始化为零。您不必初始化它。如果您确实需要运行初始化代码,您可以执行如下hack(在c++中):

struct my_array_initializer {
    my_array_initializer() {
        // Initialize the global array here
    }
};
my_array_initializer dummy_variable;

如果您使用的是GCC(或Clang),您可以在main之前执行带有constructor属性的代码:

__attribute__((constructor))
void initialize_array()
{
    // Initialize the global array here
}

所有全局变量(文件范围内的变量)默认初始化为零,因为它们具有静态存储持续时间(C99 6.7.8.10)。所以严格来说,你不需要将它们初始化为零,C标准保证它们默认为零。

然而,正如Ziyao Wei在回答中提到的那样,显式初始化它们是良好的编程实践。

不行,函数之外不能有代码。

你可以把它放在某个函数中,从main开始调用。

一种方法是添加一个全局函数

  • 检查数组是否初始化
  • 初始化未初始化的数组
  • 返回数组

示例代码:

int* get_cc_no_issue()
{
  if(!kIsMyArrayInitialized)
  {
    /* todo: somehow get "context" globally... */
    for(int k = 0; k < context.size(); k++)
    {
      cc_no_issue[k] = 0;
    }
    kIsMyArrayInitialized = true;
  }
  return cc_no_issue;
}

如果你想要非零初始化,这是非常有用的。

对于零初始化,参见对另一个问题的回答:全局内存在c++中初始化吗?

可以把数组放在全局对象的构造函数中。

int cc_no_issue[256];
struct Init {
  Init(int a, unsigned int size)
  {
    memset(a, 0, size);
  }
};
Init arr(cc_no_issue, sizeof(cc_no_issue));

作为@Bo Persson,在函数中进行。但是,在c++中已经有一种算法可以帮你做到这一点。不需要写一个手写的循环

std::fill(cc_no_issue, cc_no_issue+context.size(); 0) ;

关于std::fill的更多信息


回复你的评论:

要使每个元素自增,可以使用std::for_each传递一个函数对象作为第三个参数。

#include <iostream>
#include <algorithm>
using namespace std;
void incrementHelper( int& a ){
        ++a;
}
int main(){
        int ar[] = { 1,2,3,4,5 };
        for_each(ar, ar+5, incrementHelper );
        for( int i=0; i<sizeof(ar)/sizeof(ar[0]); ++i ){
                cout << ar[i] << endl;
        }
        return 0;
}

输出:

2
3
4
5
6

for_each(ar, ar+5, incrementHelper);

对于数组中的每个元素,算法将调用函数incrementHelper。在C术语中,也就是说,它作为对数组中每个元素的回调。现在回调函数通过引用接收传递的元素。所以,修改引用也会修改被引用。

你需要决定语言。这方面的机制在C和c++中是不同的。基本上,C没有在主函数开始之前运行代码的方法,所以你不能在C中对数组进行复杂的初始化。在c++中,你确实有一些选择,一种是停止使用裸数组(这是一个C结构),而是将数组包装在类中,并在类构造函数中进行初始化。

CC cc_no_issue;
class CC
{
public:
  CC()
  {
    // initialisation of array goes here
  }
private:
  int array[100];
};

另一种方法是使用vector,并编写函数来初始化vector。

std::vector<int> cc_no_issue = init_vector();
std::vector<int> init_vector()
{
  std::vector<int> tmp;
  // initialisation of tmp goes here
  return tmp;
}