C范围问题

时间:2010-01-23 00:37:50

标签: c scope

以下代码是否有效

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 个答案:

答案 0 :(得分:11)

不,不是,b已超出范围,访问它(通过指针)是未定义的行为。

答案 1 :(得分:3)

正如经常发生的那样,你问的问题并不是关于范围,而是关于对象的生命周期b数组对象的生命周期在if块的末尾结束,并且在此之后访问它的任何尝试都会导致未定义的行为。

事实上,从迂腐的角度来看,它更多地是a而不是约b:一旦b的生命周期结束,a的价值就会变得不确定。尝试“做某事”依赖于指针的不确定值会导致未定义的行为。

答案 2 :(得分:1)

其未定义的行为 - 在内部作用域中声明的对象的存储持续时间(例如 b 此处)持续到其声明的块的末尾。