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

我正在尝试这样做:

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

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

在“for”之前预期的不合格ID
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]; 

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

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

你可以将它放在一些函数中并从main的开头调用它。

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

  • 检查arrays是否已初始化
  • 如果数组未初始化,则初始化该数组
  • 返回数组

示例代码:

 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 ++中初始化?

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

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

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

 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  #include  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 

输出继电器:

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

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

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