ли следующий код действителен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?
}
ли следующий код действителен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?
}
Нет, это не так, б вышел из рамки, доступ к нему (через указатель) является неопределенным поведением.
Его неопределенное поведение - продолжительность шага obect, объявленного во внутренней области (например, b здесь), длится до конца блока, в котором его объявили.
Как это часто бывает, вопрос, который вы задаете не совсем о масштабы, а о время жизни объекта. Время жизни объекта массива b
заканчивается в конце блока if
, и любые попытки доступа к нему после этого приводят к неопределенному поведению.
В самом деле, педантично говоря, это даже больше о a
чем о b
: один раз в жизни b
концов, значение a
становится неопределенным. Попытка «сделать что-то», которая опирается на неопределенное значение указателя, приводит к неопределенному поведению.
Действительно симпатичное объяснение. –
Нет? Он спрашивает: «имеет ли массив a указание слишком [sic] вышел из сферы действия». Это определенно должно быть да. –
@Charles: «Является ли следующий код действительным?» «Нет, это ... неопределенное поведение». Кажется, это хорошо для меня. –
Сфера действия только для имен - для выделенного пространства (что указывает 'a'), имеет значение продолжительность хранения, которая в этом случае одинакова, но может быть не в других. –