2010-01-23 2 views
4

ли следующий код действителенC сфера вопрос

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

ответ

11

Нет, это не так, б вышел из рамки, доступ к нему (через указатель) является неопределенным поведением.

+0

Нет? Он спрашивает: «имеет ли массив a указание слишком [sic] вышел из сферы действия». Это определенно должно быть да. –

+1

@Charles: «Является ли следующий код действительным?» «Нет, это ... неопределенное поведение». Кажется, это хорошо для меня. –

+3

Сфера действия только для имен - для выделенного пространства (что указывает 'a'), имеет значение продолжительность хранения, которая в этом случае одинакова, но может быть не в других. –

1

Его неопределенное поведение - продолжительность шага obect, объявленного во внутренней области (например, b здесь), длится до конца блока, в котором его объявили.

3

Как это часто бывает, вопрос, который вы задаете не совсем о масштабы, а о время жизни объекта. Время жизни объекта массива b заканчивается в конце блока if, и любые попытки доступа к нему после этого приводят к неопределенному поведению.

В самом деле, педантично говоря, это даже больше о a чем о b: один раз в жизни b концов, значение a становится неопределенным. Попытка «сделать что-то», которая опирается на неопределенное значение указателя, приводит к неопределенному поведению.

+0

Действительно симпатичное объяснение. –

Смежные вопросы