C++ 返回结构数组

Posted

技术标签:

【中文标题】C++ 返回结构数组【英文标题】:C++ Return Array of Structs 【发布时间】:2014-06-02 08:14:50 【问题描述】:

好的,我有一个这样的结构:

typedef struct name

    string thing1;
    string thing2;
    int thing3;
    int thing4;
;

我使用了一个函数,它遍历数据并将所有内容分配到一个结构数组中,建立内部结构数组。 名称结构名;

函数运行良好并正确分配内部的所有内容... structname[i].thing1 structname[i].thing2 等会在函数内部正常运行

我的问题是如何分配函数来返回这个结构数组?我似乎无法使用指针来做到这一点,我已经在网上广泛寻找答案。

编辑:首先,先在这里发帖。一直在使用这些资源,但我不能再强调在学习 php、c++ 等方面有多大帮助。你们都一直在。 我可以使用指针将结构很好地传递给函数,它只是返回一个结构数组,这似乎是问题所在。我的函数设置为 void 所以我一直在使用 void function(struct name &input) 但这显然似乎并没有修改结构。我也尝试将该函数用作返回类型,但它不匹配,因为它是一个数组而不是结构。

【问题讨论】:

C 还是 C++?虽然问题适用于两种语言,但答案会有很大差异。 @DieterLücking:不能在 C 或 C++ 中按值返回原始数组 无需弄乱 C 数组 - 使用 std::vector 或 std::array (如果可以使用 C++11,则使用后者)。 【参考方案1】:

这就是我的做法。

typedef struct name

    string thing1;
    string thing2;
    int thing3;
    int thing4;
;

name** getNames(size_t count) 
    size_t i;
    name** names = malloc(count * sizeof(*names));
    for(i = 0; i < count; i++) 
        names[i] = malloc(sizeof(**names));
        names[i]->thing1 = "foobar";
    
    return names;

编辑: 我刚刚注意到这是关于 c++ 的,所以其他答案可能更好。

【讨论】:

@leemes 谢谢。固定 C 和 C++ 都在标签中,所以这个答案当然仍然值得赞赏。【参考方案2】:

似乎没有提到这一点。 与在函数func 中创建动态内存并返回指向它的指针相比,这种方法更好的原因是,在我们的例子中,调用者拥有内存(她创建并传递给函数 - 例如,buff2)和无论如何都必须释放它。而在前一种情况下,调用者可能会忘记释放函数返回的内存。您还可以以根本不需要释放任何东西的方式使用它(例如,“第一次使用”)。

在 C 中:

void func(struct name *x, int len)


   for(int i = 0; i<len; i++)
   
      // Init each array element x[i]
      x[i].thing1="text1";
      x[i].thing2="text2";
      // etc.
   



您必须小心使用正确的len 值,否则您将写入数组。

用法:

int main()

   // 1) One way - no dynamic memory
   struct name buff1[10];
   func(buff1,10);

   // 2) Other way - with dynamic memory
   struct name *buff2 = malloc(10*sizeof(struct name));
   func(buff2,10);
   free(buff2);

【讨论】:

【参考方案3】:

在 C++ 中,您将使用 std::vector:

std::vector<name> f(); // return by value

void f( std::vector<name>& v); // take by reference and assign to vector
                               // inside a function f

在 C 中不能返回数组类型。您可以返回指向数组的指针。两个选项是:在函数 f 中分配内存或填充预先分配的内存(由调用者预先分配)。例如:

1.

name* f( int count) 
    name *ret = malloc( count * sizeof( name));
    if( !ret)
        return NULL;

    for( int i = 0; i < count; ++i) 
        // ret[i] = ... initialize  

    return ret;
;

int main() 
    name *p = f(10);
    if( p) 
        // use p
        free( p);  // don't forget
    

    return 0;

2.

void f( name* p, int count) 

    if( !p)
        return;

    for( int i = 0; i < count; ++i) 
        // p[i] = ... initialize  
;

int main() 
    name *p = malloc( 10 * sizeof( name));
    f( p, 10);
    free( p);  // don't forget
    return 0;

3.

void f( struct name p[], int count) 

    if( !p)
        return;

    for( int i = 0; i < count; ++i) 
        // p[i] = ... initialize  
;

int main() 
    name p[10];
    f( p, 10);
    return 0;

【讨论】:

谢谢!在使用向量方法的 C++ 中,f() 函数是否需要返回 return name[]?或者没有数组括号的返回名称是否有效? 在传递数组时也是如此 f(); C++ 说的参数太少了。 std::vector f() std::vectorv; v.push_back(name"1", "2", 1, 2);返回 v; 示例:ideone.com/UHZd5U【参考方案4】:

确实,C++ 不推荐返回数组,而是指向它们的指针,但是! C++ 允许一切。特别是:

#include "stdafx.h"
#include <iostream>

using namespace std;

typedef struct h
    int f[2];
;

h my()
    h a;
    a.f[0]=1;
  a.f[1]=2;
return a;


int _tmain(int argc, _TCHAR* argv[])

    h j;
    j=my();
    cout << j.f[0];
    system("pause");
    return 0;

【讨论】:

j 不是结构体数组,而是内部有数组的结构体。

以上是关于C++ 返回结构数组的主要内容,如果未能解决你的问题,请参考以下文章

C++的一个函数的返回值可以是结构体吗?

调用使用 C# 返回结构数组的非托管 dll 函数

返回指向结构的指针并访问其字段 C++

c++ 结构指针转换为数组互操作 c#

如何将结构数组从 c++ 传递到 c#?

从函数C++返回3个元素[重复]