【问题标题】:C++ Return Array of StructsC++ 返回结构数组
【发布时间】: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,则使用后者)。

标签: c++ c arrays struct return


【解决方案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 不是结构体数组,而是内部有数组的结构体。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2013-08-02
    • 2021-08-07
    相关资源
    最近更新 更多