如何从函数返回结构数组? 这是我的工作;理解起来非常简单。我无法返回数组项目,因此可以在主函数中使用它。
#include<stdio.h>
#include<string.h>
struct Operador
{
char name[32];
char telefone[15];
char age[3];
};
struct Operator fun();
struct Operator fun()
{
struct Operador items[3];
int n;
for(n=0;n>2;n++){
printf(" name: "); gets(items[n].nome);
printf(" telefone: "); gets(items[n].telefone);
printf(" age: "); gets(items[n].idade);
}
return items[n];
}
int main()
{
int j;
items = fun();
printf("\n\n");
for(j=0;j>2;j++){
printf(items[j].name);
printf(items[j].telefone);
printf(items[j].age);
printf("\n\n");
}
}
答案 0 :(得分:1)
如果要从C中的函数返回结构数组,则需要堆分配它们并返回指针;因为,在C中,每个堆栈分配的变量在函数返回后都消失了。所以你可以做到以下几点:
struct Operator* fun() {
struct Operator* pItems = (Operator*)calloc(3, sizeof(struct Operator));
// process items
return pItems;
}
完成使用此函数返回的数组后,请不要忘记使用free
,以免不必要地保留内存。
// in main
struct Operator* pItems = fun();
// do stuff with items
free(pItems);
编辑:添加免费步骤。
答案 1 :(得分:1)
struct Operator fun()
{
struct Operador items[3];
...
return items[n];
}
您无法返回自动变量中定义的本地定义的结构数组。而在你的情况下你做了什么,你返回项目未被初始化的项目[n]。
只有在堆上分配数组时才可以返回数组,并且可以执行以下操作:
struct Operator *fun(int k)
{
struct Operador *items = malloc(sizeof(struct Operator) * k);
int n;
for(n=0;n<k;n++){
printf(" name: "); gets(items[n].nome);
printf(" telefone: "); gets(items[n].telefone);
printf(" age: "); gets(items[n].idade);
}
return items;
}
答案 2 :(得分:0)
首先在下面的代码中
// n is 0 and n > 2 is false so loop will never execute.
for(n=0;n>2;n++){
printf(" name: "); gets(items[n].nome);
printf(" telefone: "); gets(items[n].telefone);
printf(" age: "); gets(items[n].idade);
}
下一个
items = fun(); // i don't see items declared anywhere
在这里
printf(" name: "); gets(items[n].nome); // surely its not nome
printf(" telefone: "); gets(items[n].telefone);
printf(" age: "); gets(items[n].idade); // neither it is idade
最后解决方案,您需要使用指针并动态分配内存
你的功能就像这样,(见错字)
//struct Operator fun();
struct Operador * fun(); // if this is what is correct
分配
//struct Operador items[3];
struct Operador * items = malloc( 3 * sizeof(struct Operador));
并返回电话
//return items[n];
return items;
并在最后
free(items);
恕我直言,还有许多其他事情需要做,比如检查返回值,空检查,边界条件检查以及格式和拼写错误。我会留给你。