是下面的代碼有效Ç範圍問題
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?
}
是下面的代碼有效Ç範圍問題
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?
}
不,它不是,B已經超出了範圍,對其進行訪問(通過指針)是未定義的行爲。
其未定義的行爲 - 在內部範圍內聲明的obect的停留持續時間(如b此處)持續到其聲明塊的結尾。
因爲它經常發生,你問這個問題是不是真正的範圍,但對象的,而約一生。 b
數組對象的生存期結束於if
塊的末尾,並且在此之後嘗試訪問它將導致未定義的行爲。
事實上,迂腐地講,它是比約b
甚至更多a
:一旦b
兩端的一生中,a
值變得不確定。試圖依靠指針的不確定值「做某事」會導致未定義的行爲。
真的很好的解釋。 – 2010-01-23 00:48:34
不是嗎?他問道:「數組a是否指向[原文如此]超出了範圍」。這絕對應該是一個肯定的答案。 – 2010-01-23 00:42:16
@Charles:「下面的代碼有效嗎?」 「不,這是......未定義的行爲」。對我來說似乎很好。 – 2010-01-23 00:43:40
範圍只對名稱很重要 - 對於分配的空間(「a」指向的是什麼),重要的是存儲時間,這種情況在這種情況下是相同的,但可能不在其他情況下。 – 2010-01-23 00:43:48