2016-02-28 129 views
0

循環,我試圖從功能和循環返回一個字符串數組throught它:通過字符串數組指針由

string* fetchArray() 
{ 
    string myArray[10] = { "0" }; 
    myArray[9] = { "End" }; 
    return myArray; 
}; 

int main() 
{ 
    string* fetchedArray = fetchArray(); 

    while (*fetchedArray != "End") 
    { 
     cout << *fetchedArray << endl; 
     fetchedArray++; 
    } 

    return 0; 
} 

不過,我做錯了什麼。這會導致運行時錯誤。我可以看到,當我調試函數調用後,* fetchedArray是空的,這可能意味着函數沒有返回我所期望的。我至少期待陣列的第一個元素是正確的。

錯誤:

Exception thrown at 0x54AA40D5 (vcruntime140d.dll) in Test.exe: 0xC0000005: Access violation reading location 0xCCCCCCCC.

通常情況下,我會用向量在這種情況下,但我想測試此行爲。

+3

不要從函數返回局部變量的地址。這樣的回報價值毫無意義,絕不能使用。 –

回答

3

您返回指向局部變量的指針。變量myArray就像所有其他局部變量一樣,並且一旦在返回中定義的函數就會超出範圍。這會給你留下一個流浪的指針,指向不再存在的數據,並導致未定義的行爲


作爲一個有趣的邊注:只需雜散指針本身不是UB,而是試圖取消引用指針是什麼導致了UB。所以你可以返回一個指向局部變量的指針,只要你不使用它(這是毫無意義的)。

+0

酷!嗯,如果我想返回這個數組,那麼解決方案是什麼? (沒有數組存儲在函數中,或使用全局變量)有沒有? – omegasbk

+1

@omegasbk如果你不想讓它成爲'static'或者global,或者改爲使用'std :: vector'或者'std :: array'(這當然是「合適」的解決方案)唯一的解決方案是動態分配堆的內存並返回該指針。 –

+2

@omegasbk解決方法是使用'std :: vector '並按值返回。 –

2

您正在返回本地變量的地址,該地址在調用返回fetchArray後超出範圍。

2

您正在返回一個指向局部變量的指針。局部變量在聲明它們的函數結束時被破壞。因此,最終會產生一個懸掛指針。導致未定義行爲的解引用。