【问题标题】:Dynamic Arrays passing to functions传递给函数的动态数组
【发布时间】:2012-02-28 08:47:42
【问题描述】:

我在主函数中创建了 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";
} 

【问题讨论】:

    标签: c++ arrays function pointers dynamic


    【解决方案1】:

    此行对调用者完全没有影响:

    arr = brr;
    

    所以在调用之后,arr 准确地指向它之前指向的位置 - 指向现在无效的内存区域(因为你删除了它)。

    如果这是一个 C 问题,我建议您使用指向指针 (string **arr) 的指针。但是,我觉得这在 C++ 程序中很讨厌。也许您想在某处使用参考?

    【讨论】:

    • 一点也不讨厌,但是如果需要,您可以使用对指针的引用:void func(string*& arr, string * brr)
    • @Asaf 我自己对 C++ 知之甚少,但我一直认为惯用的 C++ 避免使用指针。不过建议不错。
    • 我看到的 ref-to-ptr (正如文章所说的那样)的优势,或者任何引用传递给你想要在函数内部修改的参数的指针是你可以' t 意外传递 NULL(在这种情况下 - &arr - arr 的地址 - 始终有效)。有时我更喜欢 ptr-to-ptr 的灵活性(调用代码不必提供输出参数)。无论如何,我对“惯用 C++ 避免指针”的方法的回应是:这是 C++。如果不想使用指针,请使用 C#。
    【解决方案2】:

    为函数设置此签名

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

    【讨论】:

      【解决方案3】:

      @cnicutar 正确诊断问题;您要么需要通过引用传递 arr(引用指针,而不是数组),要么让 fund 返回调用者可以分配的 arr 的新值。

      【讨论】:

      • 从技术上讲,您之前没有通过引用传递 arr:您通过值传递指针(这就是为什么对指针的更改在函数之外没有影响)。 & 表示通过引用传递,可以应用于任何东西。
      • 是的,我想我明白了。因此,通过添加额外的 &,我在函数中所做的任何更改也会影响 main 中的“arr”数组。非常感谢。它实际上是一个非常简单的修复。我添加了相当多的代码来规避这个问题。
      猜你喜欢
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      相关资源
      最近更新 更多