main will have a value of zero, and 0x600864 will presumably be &main (it's not the initial arbitrary value of main).
Auto variables are left uninitialized so that they don't have to be given a value when they're allocated. It's for efficiency, and it makes the compiler simpler to have this blanket rule rather than have it try to figure out the minimal initializations necessary (which probably isn't even possible). But this ocnsideration doesn't apply to globals or statics, because the initialization can be done at compile time, or (sometimes, in C++) on program startup.
> the initialization can be done at compile time, or (sometimes, in C++) on program startup
With ELF binaries for C programs it's done at startup as well. The data segment is created as having memory size SIZEM and file size SIZEF. If SIZEF < SIZEM, memory from SIZEF to SIZEM is set to 0.
No, they're not. In fact, if the program used 'static main;' instead, it wouldn't even compile because the 'main' symbol wouldn't be visible by the linker.
Yes they are !
Global variables have static storage duration and are therefore default initialized.
Be careful with the word 'static' which does not always correspond to the the keyword static which has several meaning ! When used with a global variable the static keyword has not the same meaning as static storage duration". It only means no external linkage.
Both have so-called "static storage duration", which is what influences the initial value. See C99 standard, section 6.2.4 paragraph 4:
"An object whose identifier is declared with external or internal linkage, or with the
storage-class specifier `static' has /static storage duration/. Its lifetime is the entire
execution of the program and its stored value is initialized only once, prior to program
startup."
The default initial value of objects with static storage duration is dealt with in 6.7.8 paragraph 10. Basically: pointers set to NULL, non-pointers have all bits reset, aggregates thus recursively.
Ok, well I agree. I mean global variables are not created dynamically. There is room reserved for them in the data segment which is initialized to 0. Can you give me an example where a global variable isn't initialized to 0? Your valgrind example doesn't say much about the value in the main variable ..
EDIT: this is wrong, see below.
That's wrong. 'static' variables are initialized to zero. Non-static variables are un-initialized, so they have a "random" value.
See:
$ valgrind ./a.out
==5118== Memcheck, a memory error detector
==5118== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==5118== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==5118== Command: ./a.out
==5118==
==5118==
==5118== Process terminating with default action of signal 11 (SIGSEGV)
==5118== Bad permissions for mapped region at address 0x600864
==5118== at 0x600864: ??? (in /home/def/a.out)
==5118== by 0x4E54A14: (below main) (in /usr/lib/libc-2.17.so)