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

时间:2011-08-09 04:38:15

标签: c++ c

我正在尝试这样做:

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

有人可以告诉我如何在全球范围内做到这一点吗?每当我尝试时,我都会遇到这些错误:

  

在“for”之前预期的不合格身份   k没有定义类型
  k没有定义类型

8 个答案:

答案 0 :(得分:7)

这样做:

long cc_no_issue[100]={0};

这是正确的initialization

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

这句话:

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

会将cc_no_issue[0]设置为1,将cc_no_issue[1]设置为2,其余设置为0.您可以看到上面的链接以获取更多信息。

答案 1 :(得分:5)

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

int some_array[1000];

它会自动初始化为零。您不必初始化它。如果你确实需要运行初始化代码,你可以像下面这样做(在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
}

答案 2 :(得分:2)

不,你不能拥有功能之外的代码。

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

答案 3 :(得分:2)

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

  • 检查阵列是否已初始化
  • 初始化数组(如果未初始化)
  • 返回数组

示例代码:

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

如果您想要非零初始化,这将非常有用。

对于零初始化,请参阅另一个问题的答案: Is global memory initialized in C++?

答案 4 :(得分:2)

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

如Ziyao Wei的回答所述,明确初始化它是一种很好的编程习惯。

答案 5 :(得分:0)

作为@Bo Persson,请在函数中执行此操作。但是,已经有一种算法可以在C ++中为您完成。无需编写手写循环。

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

More info on 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术语中,它可以作为数组中每个元素的回调。现在回调函数,通过引用接收传递的元素。因此,修改引用也将修改引用。 See the online demo.

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

CC cc_no_issue;

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

另一种使用向量的方法,并编写一个函数来初始化向量。

std::vector<int> cc_no_issue = init_vector();

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