2014-02-06 30 views
1

我需要訪問兩個不同功能的動態數組。對其進行的更改需要轉移到另一個。如何訪問兩個不同功能的動態數組C++

這些功能:

void populate(int size, int *ptr) 
{ 
    ptr = new int[size]; 
    for (int i = 0; i < size; i++) 
    { 
     ptr[i] = rand() % 51; 
    } 
} 

void display(int size, int *ptr) 
{ 
    for (int i=0; i < size; i++) 
    { 
     cout << ptr[i] << endl; 
    } 
} 

它被稱爲主爲

int* ptr = NULL; 

回答

5

populate,你試圖讓你傳遞給函數指向一個動態分配的指針陣列。但你通過通過指針。這對調用方沒有任何影響,並導致內存泄漏。你需要通過引用傳遞要麼指針:

void populate(int size, int*& ptr) 
          ^

或歸還

int* populate(int size) 
{ 
    int* ptr = new int[size]; 
    .... 
    return ptr; 
} 

但這樣做的最簡單,最安全的辦法是使用兩個功能的std::vector<int>代替。例如

std::vector<int> populate(size_t size) 
{ 
    std::vector<int> v(size); 
    for (auto& i : v) 
    { 
     i = rand() % 51; 
    } 
    return v; 
} 

void display(const std::vector<int>& v) 
{ 
    for (auto i : v) 
    { 
    std::cout << ptr[i] << std::endl; 
    } 
} 

這種方式,顯然正在返回什麼,調用者不必對是否具備管理資源指向一個原始指針閱讀起來。

請注意,populate可以通過致電std::generatedisplay致電std::copy進行替換。

1

你必須記住,當傳遞參數給函數時,它們被傳遞的值爲,這意味着它們被複制。所以當你傳遞一個指向函數的指針時,指針會被複制,並且當你修改指針時(例如ptr = new int[size]),你只能修改本地副本。

在C++中,你可以通過參考這意味着可以修改參數和它們的變化將在調用函數中被反射傳遞參數

void populate(int size, int*& ptr) 
0

一個簡單的解決方案是使所述第一功能返回指針並將其存儲在另一個變量中。然後您可以將其發送到第二個功能。

+0

良好的貢獻,但用編碼示例會更好:) – jbaums

0

通常,當你需要一個指針傳遞給它執行指針的初始化函數,你要麼通過P * ointer爲指針 *或返回一個指針功能。

這樣做是簡單地從填入函數返回一個指針最簡單的方法:

int* populate(int size, int *ptr) 
{ 
    ptr = new int[size]; 
    for (int i = 0; i < size; i++) 
    { 
     ptr[i] = rand() % 51; 
    } 
    return ptr; 
} 

int*p = populate(N,p); 


display(int size, int *ptr) 
{ 
    for (int i=0; i < size; i++) 
    { 
     cout << ptr[i] << endl; 
    } 
} 

爲什麼只是傳遞指針不工作的指針是按值傳遞的原因,這意味着指針的本地副本在您的函數中本地創建;當您退出功能時,本地副本正在被初始化和銷燬​​