【问题标题】:How can I initialize an array globally in C or C++?如何在 C 或 C++ 中全局初始化数组?
【发布时间】:2011-08-09 04:38:14
【问题描述】:

我正在尝试这样做:

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

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

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

【问题讨论】:

  • 我相信它已经被零初始化了。看到这个答案:stackoverflow.com/questions/60653/…
  • 在 C++ 中,全局变量是值初始化的(即数组内容将设置为0)。我不知道C,你对什么语言真正感兴趣?

标签: c++ c


【解决方案1】:

这样就可以了:

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。您可以查看上面的链接了解更多信息。

【讨论】:

  • 所以我没有别的办法可以设置 cc_no_issue[0]=0 cc_no_issue[1]=0 cc_no_issue[2]=0 cc_no_issue[3]=0? ?
  • ziyao 感谢您的回复....虽然我的问题是在一个单独的函数中,但我想根据我的 k 值来增加所有这些值。例如...如果我想增加 cc_no_issue[k]++;这个 k 值可以从 0-3 动态变化,所以我想确保它增加正确的值。我确实看到您在那里将 100 个元素设置为零
  • 抱歉我的误解...我想我定义 100 或 100 个元素真的没关系...当我在下面的函数中使用 K 时,无论它是 1 还是 100将增加该数组中的正确元素...这是正确的吗?
  • @cdub:我不确定我是否理解你,但我认为应该没问题。 100 只是大小,您可以像往常一样控制数组的任何元素。初始化只是将所有未指定的元素设置为 0。
  • 谢谢子瑶我试试看!
【解决方案2】:

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

int some_array[1000];

它将自动初始化为零。您不必初始化它。如果你确实需要运行初始化代码,你可以像下面这样(在 C++ 中)进行 hack:

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

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

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

【讨论】:

    【解决方案3】:

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

    但是,正如 Ziyao Wei 的回答中提到的那样,显式初始化它们是一种很好的编程习惯。

    【讨论】:

      【解决方案4】:

      不,你不能有函数之外的代码。

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

      【讨论】:

      • 呃...所以我没有别的办法来设置可以做的事情 cc_no_issue[0]=0 cc_no_issue[1]=0 cc_no_issue[2]=0 cc_no_issue[3 ]=0??
      • 有(我只回答了一半问题)。子瑶展示了如何将所有值设置为零。您还可以为不同的数组元素设置不同的值,例如 {1,2,3,4,5}
      【解决方案5】:

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

      • 检查数组是否已初始化
      • 如果数组未初始化,则对其进行初始化
      • 返回数组

      示例代码:

      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++?

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • 将数组初始化放在某个全局对象的构造函数中只是为了使其全局初始化并没有多大意义,尤其是当一个人可以通过其他可能的方式实现相同而无需这样做时不必要的强耦合。
        • @Als, Init 构造函数可以进一步推广到使用template 接受任何类型和任何大小。无论如何,这只是其中一种方式。由于其他答案中已经提到了其他方式。
        【解决方案7】:

        作为@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.

        【讨论】:

        • 我对 c++ 很陌生,你能告诉我这个...我如何能够为每个元素增加这个值。例如我想做这个 cc_no_issue[k]++;
        【解决方案8】:

        您需要决定语言。这在 C 和 C++ 中的机制是不同的。基本上,C 在您的 main 函数启动之前没有运行代码的方法,因此您不能在 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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-06-17
          • 2011-02-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多