Su variable d
generalmente no se saca de la pila. Las llaves no indican un marco de pila. De lo contrario, no podría hacer algo como esto:
char var = getch();
{
char next_var = var + 1;
use_variable(next_char);
}
Si las llaves causan un verdadero empuje / pop de pila (como lo haría una llamada a la función), entonces el código anterior no se compilaría porque el código dentro de las llaves no podría acceder a la variable var
que vive fuera de las llaves (como un sub- La función no puede acceder directamente a las variables en la función de llamada). Sabemos que este no es el caso.
Las llaves se utilizan simplemente para determinar el alcance. El compilador tratará cualquier acceso a la variable "interna" desde fuera de los corchetes como no válidos, y puede reutilizar esa memoria para otra cosa (esto depende de la implementación). Sin embargo, no se puede quitar de la pila hasta que vuelva la función de cierre.
Actualización: Esto es lo que la especificación C tiene que decir. Con respecto a los objetos con duración de almacenamiento automático (sección 6.4.2):
Para un objeto que no tiene un tipo de matriz de longitud variable, su vida útil se extiende desde la entrada en el bloque con el que está asociado hasta que la ejecución de ese bloque termina de todos modos.
La misma sección define el término "vida útil" como (el énfasis es mío):
La vida útil de un objeto es la parte de la ejecución del programa durante la cual se garantiza que el almacenamiento estará reservado para él. Existe un objeto, tiene una dirección constante y conserva su último valor almacenado durante toda su vida útil. Si se hace referencia a un objeto fuera de su vida útil, el comportamiento es indefinido.
La palabra clave aquí es, por supuesto, 'garantizada'. Una vez que abandona el alcance del conjunto interno de llaves, la vida útil de la matriz ha terminado. El almacenamiento puede o no estar asignado (el compilador puede reutilizar el espacio para otra cosa), pero cualquier intento de acceder a la matriz invoca un comportamiento indefinido y produce resultados impredecibles.
La especificación C no tiene noción de marcos de pila. Solo habla de cómo se comportará el programa resultante y deja los detalles de la implementación al compilador (después de todo, la implementación se vería bastante diferente en una CPU sin pila que en una CPU con una pila de hardware). No hay nada en la especificación C que indique dónde terminará o no un marco de pila. La única forma real de saber es compilar el código en su compilador / plataforma particular y examinar el ensamblaje resultante. El conjunto actual de opciones de optimización de su compilador probablemente también jugará un papel en esto.
Si desea asegurarse de que la matriz d
ya no consume memoria mientras se ejecuta el código, puede convertir el código entre llaves en una función separada o explícitamente malloc
y free
la memoria en lugar de utilizar el almacenamiento automático.