I have the concept of static local variables down pretty well: global lifespan, local scope. Similarly, I understand automatic variables are allocated/deallocated automatically when program flow enters and leaves the variable's context.
#include <stdio.h> void test_var(void){ static unsigned foo = 0; unsigned bar = 0; printf(" %u %u\n", foo++, bar++); } int main(void){ printf("Foo Bar\n"); printf("--- ---\n"); for(unsigned x = 0; x < 10; x++){ test_var(); } return 0; } As such, the previous example behaves as expected and prints the following output:
Foo Bar --- --- 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 What confuses me is how the variables behave when not initialized:
#include <stdio.h> void test_var(void){ static unsigned foo; /* not initialized */ unsigned bar; /* not initialized */ printf(" %u %u\n", foo++, bar++); } int main(void){ printf("Foo Bar\n"); printf("--- ---\n"); for(unsigned x = 0; x < 3; x++){ test_var(); } return 0; } Output:
Foo Bar --- --- 0 2 1 3 2 4 3 5 4 6 5 7 6 8 7 9 8 10 9 11 So the static variable behaves as expected -- getting a default value of 0 and persisting through the function calls; but the automatic variable seems to persist as well -- although holding a garbage value, it increments in each call.
Is this occurring because the behavior is undefined in the C standard, or is there a set of rules in the standard that explain this?
baris always placed at the same position and that is never overwritten between the calls.bargets put.