Le temps pendant lequel la variable est en fait de prendre de la mémoire est évidemment compilateur-dépendante (et de nombreux compilateurs ne pas ajuster le pointeur de pile, lorsque les blocages intérieurs, sont entrés et sortis à l'intérieur des fonctions).
Cependant, étroitement liés, mais peut-être plus question intéressante est de savoir si le programme est autorisé à accéder intérieur de l'objet à l'extérieur de l'intérieur de la portée (mais à l'intérieur de la fonction contenante), c'est à dire:
void foo() {
int c[100];
int *p;
{
int d[200];
p = d;
}
/* Can I access p[0] here? */
return;
}
(En d'autres mots: est-ce que le compilateur a permis de libérer d
, même si dans la pratique, la plupart ne le font pas?).
La réponse est oui, le compilateur est autorisé à libérer d
, et d'accéder p[0]
où le commentaire indique, est un comportement indéterminé. La partie pertinente de la norme C est 6.2.4p5:
Pour un tel objet [celui qui a
automatique de la durée de stockage] qui ne
ne pas avoir une longueur variable de type tableau,
sa durée de vie s'étend de l'entrée dans le bloc auquel il est associé
jusqu'à l'exécution de ce bloc se termine dans
de toute façon. (La saisie d'un joint de bloc
ou l'appel d'une fonction suspend, mais
n'a pas de fin, de l'exécution du présent
le bloc.) Si le bloc est entré
de manière récursive, une nouvelle instance de la
l'objet est créé à chaque fois. L'
valeur initiale de l'objet est
durée indéterminée. Si une initialisation
défini pour l'objet, c'est
effectué à chaque fois que la déclaration est
atteint dans l'exécution du bloc;
sinon, la valeur devient
indéterminée à chaque fois que l'
la déclaration est atteint.