¿Cómo devuelvo una matriz de estructura desde una función?

¿Cómo devuelvo una matriz de estructura desde una función? Aquí está mi trabajo; Es bastante simple de entender. No puedo devolver los elementos de la matriz para que se puedan usar en la función principal.

#include #include 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]; } 

No puede devolver una matriz de estructuras definida localmente definida en una variable automática. Y lo que hace en su caso, devuelve artículos [n] para una n donde no se inicializaron los artículos.

puede devolver una matriz solo si la asigna en el montón y puede hacer algo para:

 struct Operator *fun(int k) { struct Operador *items = malloc(sizeof(struct Operator) * k); int n; for(n=0;n 

Si desea devolver una matriz de estructuras desde una función en C, debe acumularlas y devolver un puntero; porque, en C, cada variable asignada a la stack desaparece después de que la función retorna. Así que puedes hacer lo siguiente:

 struct Operator* fun() { struct Operator* pItems = (Operator*)calloc(3, sizeof(struct Operator)); // process items return pItems; } 

Una vez que haya terminado de usar la matriz devuelta por esta función, no se olvide de usar free en ella para que la memoria no se mantenga innecesariamente.

 // in main struct Operator* pItems = fun(); // do stuff with items free(pItems); 

Editar: Añadir paso libre.

primero en este código de abajo

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

siguiente

  items = fun(); // i don't see items declared anywhere 

y aquí

  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 

Finalmente, necesita usar punteros y asignar memoria dinámicamente.

Su función se convierte en algo como esto, (ver el error tipográfico)

 //struct Operator fun(); struct Operador * fun(); // if this is what is correct 

Asignación

  //struct Operador items[3]; struct Operador * items = malloc( 3 * sizeof(struct Operador)); 

y devolver la llamada

 //return items[n]; return items; 

Y al final

 free(items); 

En mi humilde opinión hay muchas otras cosas que deben hacerse, como verificar los valores de retorno, las comprobaciones nulas, la verificación de las condiciones de los límites y un poco de formato y errores tipográficos. Lo dejo en tus manos.