2010-01-23 134 views
4

是下面的代碼有效Ç範圍問題

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

不,它不是,B已經超出了範圍,對其進行訪問(通過指針)是未定義的行爲。

+0

不是嗎?他問道:「數組a是否指向[原文如此]超出了範圍」。這絕對應該是一個肯定的答案。 – 2010-01-23 00:42:16

+1

@Charles:「下面的代碼有效嗎?」 「不,這是......未定義的行爲」。對我來說似乎很好。 – 2010-01-23 00:43:40

+3

範圍只對名稱很重要 - 對於分配的空間(「a」指向的是什麼),重要的是存儲時間,這種情況在這種情況下是相同的,但可能不在其他情況下。 – 2010-01-23 00:43:48

1

其未定義的行爲 - 在內部範圍內聲明的obect的停留持續時間(如b此處)持續到其聲明塊的結尾。

3

因爲它經常發生,你問這個問題是不是真正的範圍,但對象的,而約一生b數組對象的生存期結束於if塊的末尾,並且在此之後嘗試訪問它將導致未定義的行爲。

事實上,迂腐地講,它是比約b甚至更​​多a:一旦b兩端的一生中,a值變得不確定。試圖依靠指針的不確定值「做某事」會導致未定義的行爲。

+0

真的很好的解釋。 – 2010-01-23 00:48:34