cdub
cdub

Reputation: 61

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

I'm trying to do this:

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

Can someone tell me how I can do that globally? Whenever I try I get these errors:

expected unqualified-id before "for"
k does not define a type
k does not define a type

Upvotes: 6

Views: 58833

Answers (8)

Lundin
Lundin

Reputation: 215350

All global variables (variables at file scope) are by default initialized to zero since they have static storage duration (C99 6.7.8.10). So strictly speaking, you needn't initialize them to zero, the C standard guarantees that they are zero by default.

It is good programming practice to initialize them explicitly however, as mentioned in the answer by Ziyao Wei.

Upvotes: 3

john
john

Reputation: 88092

You need to decide on the language. The machanisms for this are different in C and C++. Basically C has no method of running code before your main function starts, so you cannot do complex initialisation of an array in C. In C++ you do have some options, one is to stop using a bare array (which is a C construct anyway) and instead wrap your array inside a class, and do the initialisation inside the class constructor.

CC cc_no_issue;

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

Another way it to use a vector, and write a function to initialise the 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;
}

Upvotes: 0

Mahesh
Mahesh

Reputation: 34665

As @Bo Persson, do it in a function instead. But, there is already an algorithm that does it for you in C++. No need to write a hand written loop.

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

More info on std::fill


Response to your comment:

To increment every element, you can make use of std::for_each passing a function object as the third argument.

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

Ouput:

2
3
4
5
6

for_each(ar, ar+5, incrementHelper );

For each element in the array, the algorithm is going to call the function, incrementHelper. In C terminology,to say, it serves as a call back for each element in the array. Now the call back function, receives the passed element by reference. So, modifying the reference will modify the referrent also. See the online demo.

Upvotes: 0

zw324
zw324

Reputation: 27210

This will do:

long cc_no_issue[100]={0};

And this is the proper initialization.

Note: this will initialize all the contents to 0.

This sentence:

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

will set cc_no_issue[0] to 1, cc_no_issue[1] to 2, and the rest to 0. You could see the link above for more information.

Upvotes: 11

iammilind
iammilind

Reputation: 70094

You can put the array in the constructor of a global object.

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

Upvotes: 0

Merlyn Morgan-Graham
Merlyn Morgan-Graham

Reputation: 59151

One way is to add a global function that:

  • Checks if the array is initialized
  • Initializes the array if it wasn't initialized
  • Returns the array

Example Code:

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

This is most useful if you want non-zero initialization.

For zero-initialization, see this answer to another question: Is global memory initialized in C++?

Upvotes: 2

Dietrich Epp
Dietrich Epp

Reputation: 213847

If you have a global array of a basic type,

int some_array[1000];

It will automatically be initialized to zero. You do not have to initialize it. If you do need to run initialization code, you can do a hack like the following (in C++):

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

If you are on GCC (or Clang), you can execute code before main with the constructor attribute:

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

Upvotes: 5

Bo Persson
Bo Persson

Reputation: 92391

No, you can't have code outside of functions.

You can put it inside some function and call that from the start of main.

Upvotes: 2

Related Questions