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这就是我的做法。
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[]?或者没有数组括号的返回名称是否有效? 在传递数组时也是如此确实,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++ 返回结构数组的主要内容,如果未能解决你的问题,请参考以下文章