initial value of int array in C

CArraysCompiler Construction

C Problem Overview


When declaring an array in C like this:

int array[10];

What is the initial value of the integers?? I'm getting different results with different compilers and I want to know if it has something to do with the compiler, or the OS.

C Solutions


Solution 1 - C

If the array is declared in a function, then the value is undefined. int x[10]; in a function means: take the ownership of 10-int-size area of memory without doing any initialization. If the array is declared as a global one or as static in a function, then all elements are initialized to zero if they aren't initialized already.

Solution 2 - C

As set by the standard, all global and function static variables automatically initialised to 0. Automatic variables are not initialised.

int a[10];  // global - all elements are initialised to 0

void foo(void) {
    int b[10];    // automatic storage - contain junk
    static int c[10]; // static - initialised to 0
}

However it is a good practice to always manually initialise function variable, regardless of its storage class. To set all array elements to 0 you just need to assign first array item to 0 - omitted elements will set to 0 automatically:

int b[10] = {0};

Solution 3 - C

Why are function locals (auto storage class) not initialized when everything else is?

C is close to the hardware; that's its greatest strength and its biggest danger. The reason auto storage class objects have random initial values is because they are allocated on the stack, and a design decision was made not to automatically clear these (partly because they would need to be cleared on every function call).

On the other hand, the non-auto objects only have to be cleared once. Plus, the OS has to clear allocated pages for security reasons anyway. So the design decision here was to specify zero initialization. Why isn't security an issue with the stack, too? Actually it is cleared, at first. The junk you see is from earlier instances of your own program's call frames and the library code they called.

The end result is fast, memory-efficient code. All the advantages of assembly with none of the pain. Before dmr invented C, "HLL"s like Basic and entire OS kernels were really, literally, implemented as giant assembler programs. (With certain exceptions at places like IBM.)

Solution 4 - C

A C variable declaration just tells the compiler to set aside and name an area of memory for you. For automatic variables, also known as stack variables, the values in that memory are not changed from what they were before. Global and static variables are set to zero when the program starts.

Some compilers in unoptimized debug mode set automatic variables to zero. However, it has become common in newer compilers to set the values to a known bad value so that the programmer does not unknowingly write code that depends on a zero being set.

In order to ask the compiler to set an array to zero for you, you can write it as:

int array[10] = {0};

Better yet is to set the array with the values it should have. That is more efficient and avoids writing into the array twice.

Solution 5 - C

According to the C standard, 6.7.8 (note 10):

> If an object that has automatic > storage duration is not initialized > explicitly, its value is > indeterminate.

So it depends on the compiler. With MSVC, debug builds will initialize automatic variables with 0xcc, whereas non-debug builds will not initialize those variables at all.

Solution 6 - C

In most latest compilers(eg. gcc/vc++), partially initialized local array/structure members are default initialized to zero(int), NULL(char/char string), 0.000000(float/double).

Apart from local array/structure data as above, static(global/local) and global space members are also maintain the same property.

int a[5] = {0,1,2};
printf("%d %d %d\n",*a, *(a+2), *(a+4));

struct s1
{
int i1;
int i2;
int i3;
char c;
char str[5];
};

struct s1 s11 = {1};
    printf("%d %d %d %c %s\n",s11.i1,s11.i2, s11.i3, s11.c, s11.str);
    if(!s11.c)
        printf("s11.c is null\n");
    if(!*(s11.str))
        printf("s11.str is null\n");

In gcc/vc++, output should be:

0 2 0 1 0 0 0.000000 s11.c is null s11.str is null

Solution 7 - C

Text from http://www.cplusplus.com/doc/tutorial/arrays/

> SUMMARY: > > Initializing arrays. When declaring a > regular array of local scope (within a > function, for example), if we do not > specify otherwise, its elements will > not be initialized to any value by > default, so their content will be > undetermined until we store some value > in them. The elements of global and > static arrays, on the other hand, are > automatically initialized with their > default values, which for all > fundamental types this means they are > filled with zeros. > > In both cases, local and global, when > we declare an array, we have the > possibility to assign initial values > to each one of its elements by > enclosing the values in braces { }. > For example: > > int billy [5] = { 16, 2, 77, 40, 12071 };

Solution 8 - C

The relevant sections from the C standard (emphasis mine):

> ### 5.1.2 Execution environments > >All objects with static storage duration shall be initialized (set to their initial values) before program startup. > > ### 6.2.4 Storage durations of objects > >An object whose identifier is declared with external or internal linkage, or with the storage-class specifier static has static storage duration. > >### 6.2.5 Types > >Array and structure types are collectively called aggregate types. > >### 6.7.8 Initialization > >If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static storage duration is not initialized explicitly, then: > > - if it has pointer type, it is initialized to a null pointer; > - if it has arithmetic type, it is initialized to (positive or unsigned) zero; > - if it is an aggregate, every member is initialized (recursively) according to these rules; > - if it is a union, the first named member is initialized (recursively) according to these rules.

Solution 9 - C

It depends from the location of your array. if it is global/static array it will be part of bss section which means it will be zero initialized at run time by C copy routine. If it is local array inside a function, then it will be located within the stack and initial value is not known.

Solution 10 - C

if array is declared inside a function then it has undefined value but if the array declared as global one or it is static inside the function then the array has default value of 0.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionbuzaliView Question on Stackoverflow
Solution 1 - CKhaled AlshayaView Answer on Stackoverflow
Solution 2 - CqrdlView Answer on Stackoverflow
Solution 3 - CDigitalRossView Answer on Stackoverflow
Solution 4 - CZan LynxView Answer on Stackoverflow
Solution 5 - CMSNView Answer on Stackoverflow
Solution 6 - Cmav_2kView Answer on Stackoverflow
Solution 7 - CKV PrajapatiView Answer on Stackoverflow
Solution 8 - CsergejView Answer on Stackoverflow
Solution 9 - Cdhokar.wView Answer on Stackoverflow
Solution 10 - CAbhinav 1036View Answer on Stackoverflow