【问题标题】:C++ return array syntax [duplicate]C ++返回数组语法[重复]
【发布时间】:2013-01-25 08:38:54
【问题描述】:

我有一个关于返回数组的 C++ 语法问题。当我们传入一个数组时,什么时候可以这样做:

void merge_sort(int input_array[], int size);//notice the first parameter

我知道这行得通:

int* merge_sort(int input_array[], int size){
    //do something with input_array
    return new int[2]; //dummy array
}

问题:

int[] merge_sort(int input_array[], int size){ //Question is on return type, wont compile
     //do something with input_array
    return new int[2]; //dummy array
}

return int* 成功。为什么返回 int [] 失败?

【问题讨论】:

  • 您知道参数int input_array[] 完全等同于int *input_array吗?
  • 这在普通的 C 中是否合法?不。所以从设计上讲,C++ 是不合法的。
  • @StoryTeller 这没什么好说的,对任何对 C 和 C++ 有一定了解的人来说都应该是显而易见的,而对于没有 C 和 C++ 知识的人来说则毫无意义。
  • @Dukeling,我也没有印象 OP 是。
  • @delnan 是的,因为我知道这一点,它提出了我的问题。

标签: c++ arrays syntax


【解决方案1】:

在 C 和 C++ 中,您既不能将数组作为参数传递给函数,也不能将数组作为函数结果返回。

是的,语法可以使它看起来就像你在传递一个数组参数:

void func(int param[]) {
    // ...
}

...

int arr[10];
func(arr);

但实际上这只是将指针传递给数组的第一个元素。参数定义int param[]调整;它完全等同于int *param。在大多数情况下,数组类型的表达式会隐式转换为其第一个元素的指针。

这就是为什么您需要将大小作为单独的参数传递。

仅使用 C 功能,有几种方法可以做一些事情返回一个数组:

  • 函数可以返回指向static 数组第一个元素的指针。这有一些缺点:大小必须固定,并且多个调用者会获得指向同一个对象的指针。
  • 函数可以接收指向数组第一个元素的指针,该指针由调用者传入。这将分配和解除分配数组的负担放在调用者身上。
  • 函数可以返回指向动态分配(C 中为malloc(),C++ 中为new)数组的第一个元素的指针。这需要调用者释放数组。

C++ 提供了一组丰富的库类,可以为您处理所有这些问题。

推荐阅读:comp.lang.c FAQ第6节。

可以将结构体作为参数传递,并将它们作为函数结果返回,结构体可以包含数组作为成员。但这并不像你想象的那么有用。作为结构成员的数组必须具有固定大小;对数组进行操作的最有用的代码可以处理动态大小。

【讨论】:

  • 我喜欢这个答案,但我有点失望的是它没有提到当数组作为成员在结构中时可以返回数组。
  • @JohannesSchaub-litb:被任命。 8-)}
【解决方案2】:

你为什么要首先退回任何东西?

数组并没有真正“传递”给函数(没有复制元素),只有指向它开始的指针。当函数重新排列数组元素时,它是在 original 数组中进行的。函数退出后,调用代码可以简单地继续使用旧的(现在排序的)数组。

换句话说,函数会产生副作用。

我知道这行得通:

int* merge_sort(int input_array[], int size){
    //do something with input_array
    return new int[2]; //dummy array
}

(假设你确实需要返回......)

它“有效”,但非常危险。调用者需要知道它需要释放返回的数组(否则会发生内存泄漏),并且它需要知道它必须使用delete[] 而不仅仅是delete(否则一个未定义的行为随之而来),这显然仅基于返回类型(它只是一个指针)是不明显的。调用者也可能怀疑 input_array 是否在函数内部被释放。

即使您已经记录了所有这些,调用者也很容易出错。最好使用现代 C++ 提供的功能:例如,您可以返回 std::vector

【讨论】:

    【解决方案3】:

    您应该在这种方法中使用向量,在您的项目中包含然后几乎像使用数组一样使用向量。

    你可以在这里查看向量:http://msdn.microsoft.com/en-us/library/vstudio/9xd04bzs.aspx

    向量的好处在于它们可以为您的项目动态缩放,并且不会由于缓冲区溢出而造成任何内存泄漏等,它很像 ArrayList

    【讨论】:

      猜你喜欢
      • 2012-08-05
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多