It's not entirely predictable, because, for example, the compiler may have already stored the first parameter of printf (the address of "%i\n") before it gets around to dereferencing f, and it may have stored it in the same location on the stack that was used for `i` in foo and bar.
It's also possible that foo() got inlined, so that the space used for `i` in foo() ends up being used for `f` in main.
It's also possible that foo() got inlined, so that the space used for `i` in foo() ends up being used for `f` in main.