est le code suivant valideC question portée
int main(){
int * a = 0;
if (!a) {
int b[500];
a = b;
}
//do something with a,
//has the array a is
//pointing too gone out
//of scope and garbage
//or is it still fine?
}
est le code suivant valideC question portée
int main(){
int * a = 0;
if (!a) {
int b[500];
a = b;
}
//do something with a,
//has the array a is
//pointing too gone out
//of scope and garbage
//or is it still fine?
}
Non, ce n'est pas, b est passé hors de portée, d'y accéder (via le pointeur) est un comportement non défini.
Son comportement indéfini - la durée de stroage d'un objet déclaré dans une portée interne (telle que b ici) dure jusqu'à la fin du bloc dans lequel il est déclaré.
Comme il arrive souvent, la question que vous posez est pas vraiment portée, mais plutôt de vie d'un objet. La durée de vie de l'objet tableau b
se termine à la fin du bloc if
et toute tentative d'accès après cela entraîne un comportement indéfini.
En fait, parlant pédante, il est encore plus sur a
d'environ b
: une fois la durée de vie des b
extrémités, la valeur de a
devient indéterminée. Une tentative de "faire quelque chose" qui repose sur la valeur indéterminée d'un pointeur conduit à un comportement indéfini.
Vraiment belle explication. –
Non? Il demande: "le tableau a pointe-t-il trop [sic] hors de portée". Cela devrait certainement être un oui. –
@Charles: "Le code suivant est-il valide?" "Non, c'est ... un comportement indéfini". Ça me semble bien. –
la portée ne concerne que les noms - pour l'espace alloué (ce à quoi pointe a), ce qui compte, c'est la durée de stockage, qui est la même dans ce cas, mais peut-être pas dans d'autres. –