簡體   English   中英

如何在兩個不同的函數中訪問動態數組C ++

[英]How to access a dynamic array in two different functions 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;

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::generate的調用替換,並可以由對std::copy的調用display

您必須記住,在將參數傳遞給函數時,它們是通過value傳遞 ,這意味着它們已被復制。 因此,當您將指針傳遞給函數時,將復制該指針,並且在修改該指針(例如ptr = new int[size] )時,僅修改本地副本。

在C ++中,您可以通過引用傳遞參數這意味着您可以修改參數,並且它們的更改將反映在調用函數中:

void populate(int size, int*& ptr)

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

通常,當您需要將指針傳遞給執行指針初始化的函數時,可以將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;
    }
}

簡單地傳遞指針不起作用的原因是,指針是通過值傳遞的,這意味着在函數中本地創建了指針本地副本 退出功能時,該本地副本正在初始化和銷毀

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM