簡體   English   中英

如何從函數返回結構數組?

[英]How do I return an array of struct from a function?

如何從函數返回結構數組? 這是我的工作; 這很容易理解。 我無法返回數組項,因此可以在main函數中使用它。

#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");
    }
}
struct Operator fun()
{
    struct Operador items[3];
     ...
    return items[n];
}

您不能返回在自動變量中定義的結構的本地定義的數組。 在這種情況下,您將為未初始化項的n返回items [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;
}

如果要從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);

編輯:添加自由步驟。

在下面的代碼中首先

//  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);

恕我直言,還有許多其他事情需要完成,例如檢查返回值,空檢查,邊界條件檢查以及格式化和錯別字位。 我留給你

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM