2014-02-06 32 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; 
    } 
} 

为什么只是传递指针不工作的指针是按值传递的原因,这意味着指针的本地副本在您的函数中本地创建;当您退出功能时,本地副本正在被初始化和销毁​​