3 ms·
> Also, global variables in C are initialized to zero implicitly, so this is equivalent: EDIT: this is wrong, see below. That's wrong. 'static' variables are
by deweerdt 13y ago
> Also, global variables in C are initialized to zero implicitly, so this is equivalent:
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)
- bnegreve 13y agoBut global variables are static.
- deweerdt 13y agoNo, 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.
- bnegreve 13y agoOk, 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, @deweerdt: ok :)
- deweerdt 13y ago@bnegreve can't reply to your post, but i was mistaken. externally visible symbols are also initialized to 0
- anarion 13y agoYes 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.
- to3m 13y agoBoth 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.
- noselasd 13y agoActually it is both. In C, variables with static storage duration are zero initialized. Global(variables at file scope) and variables with static linkage (i.e. the static keyword) both of have static storage duration.
- deweerdt 13y agoThat's correct, my bad.
- to3m 13y agoSee my post: https://news.ycombinator.com/item?id=5762363 https://news.ycombinator.com/item?id=5762363 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.
- lgeek 13y ago> 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.