2012-02-06 108 views
2

我在主函數中創建了2個動態數組。我已經通過引用將它們兩個都傳遞給函數。然後我將數據從較小的動態數組複製到較大的動態數組。我刪除了較小的動態數組。將較大動態數組的地址分配給較小的動態數組。現在理想情況下,arr數組的大小應該是10.但是,當我嘗試在main中打印數組的第6個元素時,它會崩潰。請看看下面的代碼:動態數組傳遞給函數

#include <iostream> 
#include <string> 

using namespace std; 

void func(string * arr, string * brr); 

int main()    
{ 
    string* arr = new string[5]; 
    arr[0] = "hello0"; 
    arr[1] = "hello1"; 
    arr[2] = "hello2"; 
    arr[3] = "hello3"; 
    arr[4] = "hello4"; 

    string* brr = new string[10]; 


    func(arr, brr); 

    for(int i = 0; i < 6; i++) 
     cout << arr[i] << endl; 

    return 0; 
} 

void func(string * arr, string * brr) 
{ 
    for(int i = 0; i < 5; i++) 
     brr[i] = arr[i]; 

    for(i = 0; i < 5; i++) 
     cout << brr[i] << endl; 

    delete []arr; 

    arr = brr; 

    arr[5] = "hello5"; 
} 

回答

3

這條線有來電絕對沒有影響:

arr = brr; 

電話後那麼,arr點究竟在何處使用前點 - 到一個現在無效的內存區域(因爲你刪除了它)。

如果這將是一個C問題,我會建議您使用指針指針(string **arr)。但是,我覺得這在C++程序中是令人討厭的。也許你想在某個地方使用參考?

+0

這不是討厭所有,但你可以使用一個參考的指針,如果你想:無效FUNC(字符串*改編,串* BRR) – Asaf 2012-02-06 21:37:37

+0

@ Asaf我自己很少了解C++,但我一直認爲習慣C++避免了指針。不錯的建議。 – cnicutar 2012-02-06 21:38:16

+0

[好文章在此](http://www.codeproject.com/Articles/4894/Pointer-to-Pointer-and-Reference-to-Pointer) – Samulk 2012-02-06 22:01:20

0

@cnicutar正確診斷問題;你需要通過引用傳遞arr(引用POINTER,而不是數組),有資金返回調用者可以分配的arr的新值。

+0

從技術上講,你並沒有通過引用傳遞arr:你正在通過值傳遞一個指針(這就是爲什麼改變指針對函數以外沒有影響)。 &表示通過引用傳遞,並且可以應用於任何事物。 – 2012-02-06 21:52:14

+0

是的,我想我明白了。因此,通過添加額外的&,我在函數中做的任何更改也會影響main中的「arr」數組。非常感謝。它其實是一個非常簡單的修復。我添加了相當多的代碼來規避這個問題。 – Samulk 2012-02-06 22:03:52

2

設置此簽名功能

void func(string * & arr, string * & brr)