2012-02-06 84 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)