以下代码是否有效
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?
}
答案 0 :(得分:11)
不,不是,b已超出范围,访问它(通过指针)是未定义的行为。
答案 1 :(得分:3)
正如经常发生的那样,你问的问题并不是关于范围,而是关于对象的生命周期。 b
数组对象的生命周期在if
块的末尾结束,并且在此之后访问它的任何尝试都会导致未定义的行为。
事实上,从迂腐的角度来看,它更多地是a
而不是约b
:一旦b
的生命周期结束,a
的价值就会变得不确定。尝试“做某事”依赖于指针的不确定值会导致未定义的行为。
答案 2 :(得分:1)
其未定义的行为 - 在内部作用域中声明的对象的存储持续时间(例如 b 此处)持续到其声明的块的末尾。