int a;
printf("%d", a);
The variable a
is an int
with automatic storage duration. The example code above is trying to print the value of an uninitialized variable (a
was never initialized). Automatic variables which are not initialized have indeterminate values; accessing these can lead to undefined behavior.
Note: Variables with static or thread local storage, including global variables without the static
keyword, are initialized to either zero, or their initialized value. Hence the following is legal.
static int b;
printf("%d", b);
A very common mistake is to not initialize the variables that serve as counters to 0. You add values to them, but since the initial value is garbage, you will invoke Undefined Behavior, such as in the question Compilation on terminal gives off pointer warning and strange symbols.
Example:
#include <stdio.h>
int main(void) {
int i, counter;
for(i = 0; i < 10; ++i)
counter += i;
printf("%d\n", counter);
return 0;
}
Output:
C02QT2UBFVH6-lm:~ gsamaras$ gcc main.c -Wall -o main
main.c:6:9: warning: variable 'counter' is uninitialized when used here [-Wuninitialized]
counter += i;
^~~~~~~
main.c:4:19: note: initialize the variable 'counter' to silence this warning
int i, counter;
^
= 0
1 warning generated.
C02QT2UBFVH6-lm:~ gsamaras$ ./main
32812
The above rules are applicable for pointers as well. For example, the following results in undefined behavior
int main(void)
{
int *p;
p++; // Trying to increment an uninitialized pointer.
}
Note that the above code on its own might not cause an error or segmentation fault, but trying to dereference this pointer later would cause the undefined behavior.