如何返回结构数组

时间:2015-07-16 14:32:47

标签: c++ arrays function pointers struct

struct zone {
  int a;
  double b;
};
zone *abc() {
  static zone r[10];
  for (int i = 0; i < 10; i++) {
    r[i].a = 2 * i;
    [r[i].b=0.5*i;
    cout << r[i].a << " " << r[i].b << endl;
  }
  return r;
}

int main() {
  zone *PP;
  zone P[10];
  PP = abc();
  for (int i = 0; i < 10; i++) {
    P[i] = (PP + i);

    cout << "work" << P[i].a << endl;
  }
  getch();
}

我需要返回一个由main调用的函数中形成的结构数组。我设法用指针检索数组,但是使用struct它不起作用。

如何返回结构数组?

4 个答案:

答案 0 :(得分:1)

您正在使用指针指定变量值:

P[i] = (PP + i);

要获取内部值的副本,您需要访问struct:

P[i] = PP[i];

会是这样的:

#include <iostream>
using namespace std;

struct zone {
  int a;
  double b;
};

zone *abc() {
   static zone r[10];
   for (int i = 0; i < 10; i++) {
       r[i].a = 2 * i;
       r[i].b=0.5*i;
       cout << r[i].a << " " << r[i].b << endl;
   }
   return r;
}

int main() {
    zone *PP;
    zone P[10];
    PP = abc();
    for (int i = 0; i < 10; i++) {
        P[i] = PP[i];

        cout << "work" << P[i].a << endl;
    }
}

您的结构只包含数字,但是,如果它包含字符串或指针,则需要进行深层复制。

答案 1 :(得分:0)

C ++的一个很酷的功能是使用引用。参考文献的最佳部分是它们允许您在不复制数据的情况下传递数据(您在内部使用相同的数据并传回)。所以如果你做了一个功能。

另一种方法是使用指向指针的指针。您可以在函数中传递指针和malloc的指针指针或地址。

structure* a;
funct(&a);
printf("%s\n", a[0].printfunction());
printf("%s\n", a[1].printfunction());
...

void funct(structure** a, int size){
*a = (structure*)malloc(sizeof(structure) * size);
(*a)[0] = ...
(*a)[1] = ..
(*a)[ size-1] = ...
}

您可以在函数外部访问数组。请务必使用malloc / new释放/删除您调用的任何内容。上面的代码可以使用新的我只是更好用c。您可以轻松地将malloc拉出函数外部,只需传入一个指向数组的指针。

答案 2 :(得分:0)

在C中,函数不能接受或返回数组。这很烦人,我从来没有听过一个很好的理由。无论如何,C ++很久以前就解决了这个问题,但它从来没有真正流行起来,原因很简单。

强制性的#34;对于任何大于玩具应用程序的东西,你应该强烈重新考虑使用裸指针和/或原始数组!&#34;

C ++引入了参考资料。它们实际上只是指针周围的语法糖,但并非所有变量只是指针周围的语法糖?在C ++中,函数可以接受和/或返回对数组的引用。像这样:

int takes (char (&arr)[10])
{
    std::cout << sizeof(arr); // 10
}

int (&returns())[10]
{
    return some_array; // Not a pointer!
}

int (&takes_and_returns (int (&arr)[10])) [10]
{
    return arr;
}

当然,我不必告诉你这是非常丑陋和难以阅读的。现代C ++救援!

template <size_t n, typename T>
using array<n,t> = T[n];

int takes (array<10,int>& arr);

array<10,int>& returns();

array<10,int>& takes_and_returns (array<10,int>& arr);

但请注意,由于new的工作方式,正确构造然后返回对动态数组的引用是一种折磨。我就是这样做的,但我甚至不确定这是否正确;可能潜伏一些UB:

int (&returns())[10]
{
    int* x = new int[10];
    return *(int(*)[10]) x;
}

当然,我们可以稍微整理一下:

using arr10 = int[10];

arr10& returns()
{
    int* x = new int[10];
    return *(arr10*) x;
}

然后,在通话网站上,您将其分配给参考,如下所示:

int (&my_array)[10] = returns();
// doing stuff ...
delete[] &my_array;

正如您所看到的,在一天结束时,让所有这些正常工作并与现有功能互操作是一种折磨。如果你需要一个函数来获取或返回一个数组,你就是这样做的。但是对于大多数用途,使用标准库容器会更好(更容易,更安全)。

答案 3 :(得分:0)

非常简单 - 通过使用另一个结构来封装返回的数组,以便克服C&#39; C&#39;语言限制。

struct zone {
  int a;
  double b;
};

struct zone_array_of_10 {
  zone arr[10];
};

zone_array_of_10 abc() {
  zone_array_of_10 r;
  for (int i = 0; i < 10; i++) {
    r.arr[i].a = 2 * i;
    r.arr[i].b=0.5*i;
    cout << r.arr[i].a << " " << r.arr[i].b << endl;
  }
  return r;
}

int main() {
  zone_array_of_10 PP;

  PP = abc();
  for (int i = 0; i < 10; i++) {

    cout << "work" << PP.arr[i].a << endl;
  }
  getch();
}

事实上,在&#39; C&#39;语言数组不能通过值传递。但结构可以。所以每当你想要传递一些数组的实际内容时没有太多麻烦 - 只需将它封装在一个结构中。