2015-11-21 53 views
2

首先我有一個函數來初始化一個數組並返回一個指向它的第一個元素的指針。C++使用指針遍歷數組

int* getPtrToArray() 
{ 
    int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

    return array; 
} 

而這個函數只是創建一個不會被使用的數組。

void testing() 
{ 
    int junk[3] = {1234, 5678, 9101112}; 
} 

這是我的主要功能:

int main() 
{ 
    // #1 
    int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
    int* ptr0 = array; 

    cout << *ptr0 << endl; 
    cout << ptr0[0] << endl; 

    // #2 
    int* ptr1 = getPtrToArray(); 

    cout << *ptr1 << endl; 
    cout << ptr1[0] << endl; 

    // #3 
    testing(); 

    cout << *ptr1 << endl; 
    cout << ptr1[0] << endl 
} 

輸出結果是:

1 
1 
1 
2066418736 // "ptr1[0]" should be the same as "*ptr1", right? 
2066418736 // since testing() does not modify the array, why "*ptr1" is changed? 
2066418736 

我認爲所有這些六個輸出應該是1(數組中的第一個元素)。任何人都可以向我解釋這個嗎?謝謝!

+1

在getPtrToArray中無法返回數組,因爲它是一個局部變量,並且一旦函數返回,它的地址就無效 – DBug

+0

您應該得到一個警告,例如「當您返回」返回時返回的「與局部變量相關聯的堆棧內存地址」數組編譯。 –

回答

1

我似乎記得類似這樣的工作,但它是一個濫用C的東西,而不是C++的東西。

如果我沒記錯的話,堆棧不會打擾舊數據,只是說它是空閒的,然後數據可能會或可能不會被破壞,下次初始化新數據時,取決於您在退出示波器之前初始化的數量並在退出範圍,編譯方式和功能使用情況。堆棧指針只是回退回收內存,並不會打擾擦除內存,因爲這需要額外的工作。

你可以得到奇數的優化,但如果你用C++編程,你不應該使用C數組,而應該使用向量或其他C++容器。另一方面,如果你用C語言或彙編語言編程,這種行爲是可以被利用的。

1

請不要將指針返回給局部變量或數組。局部變量的內存將在程序超出範圍後被回收,從而導致未定義的行爲。

1

數組是本地的。當函數調用返回時,內存被釋放。 ptr1正在引用未定義區域。

int* getPtrToArray() 
{ 
    int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

    return array; 
}