Сфера применения вопроса - PullRequest
4 голосов
/ 23 января 2010

Действителен ли следующий код

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

Ответы [ 3 ]

11 голосов
/ 23 января 2010

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

3 голосов
/ 23 января 2010

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

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

1 голос
/ 23 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...