2010-01-23 7 views
4

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? 
} 

Répondre

11

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.

+0

Non? Il demande: "le tableau a pointe-t-il trop [sic] hors de portée". Cela devrait certainement être un oui. –

+1

@Charles: "Le code suivant est-il valide?" "Non, c'est ... un comportement indéfini". Ça me semble bien. –

+3

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. –

1

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é.

3

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.

+0

Vraiment belle explication. –