如何从函数返回结构数组?

时间:2017-10-31 04:59:42

标签: c

如何从函数返回结构数组? 这是我的工作;理解起来非常简单。我无法返回数组项目,因此可以在主函数中使用它。

#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");
    }
}

3 个答案:

答案 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);

恕我直言,还有许多其他事情需要做,比如检查返回值,空检查,边界条件检查以及格式和拼写错误。我会留给你。