Во-первых, переменные с модификатором static видны только в модуле в котором объявлены. Хотя, в общем случае, они будут физически храниться всю жизнь программы. Во-вторых, переменные, объявленные внутри блока живут только на время выполнения этого блока, кроме static внутри функции. Грубо говоря, все что внутри фигурных скобок только там и существует. Причем, блок можно создать и в нетипичных местах, например, case 0: {int i; break;} или вообще в произвольном месте функции. В-третьих, оптимизатор сам следит за тем, где используется переменная. И если он видит, что дальше в функции переменная не используется, то физически на ее месте в памяти может разместить другую. Но с точки зрения текста программы, конечно, она будет считаться видимой до конца блока.