There are two types of variables: initialized and uninitialized.
The first set are variables where you have specifically given them a value when your created them:
int x = 666;
And the system sets the value each time the variable is created (that may be often: local variables are created when the function is executed, and destroyed when it exits).
The second set is different: if you don't specify a value explicitly, then the system can do one of two things:
1) Give it a default value (usually zero) when it is created.
Or
2) Give it no value, in which case the memory remains at whatever value it was holding when it was last used - which is unlikely to be useful, and may not even be consistent, because memory is "recycled" and may have been used for a totally different variable (or even a return address!) last time before it was allocated to your shiny new variable.
The selection of these is generally controlled by compiler switches, and in most cases they default to "no value set"
You should always ensure that you set a value before you use a variable, as you can't guarantee that it will behave the same way each time it is run!