2013-12-10 98 views
2

我遇到了一些相當奇怪的東西,我找不到任何合理的東西。 我寫了這樣的函數返回一個int指針這樣的:錯誤地使用指針或錯誤?

int* arr() 
{ 
    int array[3]={1,2,3}; 
    return array; 
} 
現在

主,我宣佈一個int指針像K:

int*k=arr(); 

它的工作完全確定,但這裏是奇怪的是,我只能使用其中一個塊,k [0]或k [1]或k [3],它會打印出正確的相應數字,但是當想要在這樣的情況下使用它時,只有第一個將正確打印:

for(int i=0;i<3;i++) 
{ 
    cout<<k[i]<<endl; 
} 

對於k [0],打印的值是正確的,但對於其他人來說,這是奇怪的。 我想知道如果我沒有使用指針正確的原因,我爲什麼可以訪問每個塊?

+1

[增加了C++語言的標籤;請糾正,如果這是錯誤的。] – DSM

+0

也許for循環引入一個新的堆棧幀,破壞你的數組。 –

回答

6

int array[3]={1,2,3};被棧分配。它將在函數結束時超出範圍。

你會被訪問懸擺指針。這是未定義的行爲。繁榮!

5

您正在返回一個指針,該上創建一個功能堆棧的對象(在此陣列)。你可以使用std :: vector來將函數中的數組傳遞給調用者。

std::vector<int> arr() 
{ 
    std::vector<int> array = { 1, 2, 3 }; 
    return array; 
} 
+1

+1,'std :: vector'應該總是第一選擇。 – cubuspl42

+0

因此返回一個本地向量會好嗎? – Default

+0

您將通過值返回矢量,而不是對它的引用,也不是指向它的指針。 –

2

這是一個錯誤的用法。該數組對於函數是本地的,所以您返回的指針在您離開函數的那一刻變得無效。內存可以在任何時候重用。

(尤其是在這個具體的例子,但這並不意味着這種行爲以任何方式保證,在你的榜樣循環,打印的第一個整數的功能覆蓋他人與自己的局部變量。)

3

你沒有正確使用它。該函數返回一個指針,使程序在函數的結束破壞的數組:

int* arr() 
{ 
    int array[3]={1,2,3}; 
    return array; 
} 

,這意味着,你的程序調用一個未定義的行爲,然後就什麼都可以發生。

如果你不想讓你的陣列全局的,那麼使它成爲一個靜態的:

int* arr() 
{ 
    static int array[3]={1,2,3}; 
    return array; 
}