Para añadir en la respuesta de Merlyn, un caso en que esto probablemente como resultado un comportamiento que no tenía la intención es la siguiente:
#include <stdio.h>
int main(){
int *p;
{
int v = 1;
p = &v;
}
{
int w = 2;
printf("%d\n", w);
}
printf("%d\n", *p);
return 0;
}
El compilador puede optimizar esto por tener v
y w
comparten la misma asignación de la pila. Nuevamente, el compilador también podría no optimizar esto, es por eso que no se define el comportamiento del uso de punteros a las variables después de su final de bloque envolvente. El programa puede generar "2" y "1", o "2" y "2", o "2" y algo completamente diferente según el compilador y la configuración que se utilicen.
En este caso particular, también puede notar diferencias en el comportamiento según la configuración de optimización del compilador. De nuevo, nada es inamovible, porque el estándar C no define lo que se supone que sucederá aquí. –