Devolver una estructura desde una función en C

Jinku Hu 12 octubre 2023
  1. Utilizar la notación estándar para devolver un struct desde una función
  2. Utilice la notación de puntero para devolver struct de la función
Devolver una estructura desde una función en C

Este artículo demostrará varios métodos sobre cómo devolver una struct de una función en C.

Utilizar la notación estándar para devolver un struct desde una función

La palabra clave struct en C se utiliza para implementar estructuras de datos definidas por el usuario. Dado que definimos el tipo struct en este ejemplo, será una notación más limpia para las declaraciones de funciones si typedef la estructura MyStruct. Asociará un nuevo alias de tipo para la estructura dada, y necesitaríamos especificar solo el nuevo nombre de alias en el prototipo de la función. Ahora, las funciones en C pueden devolver la struct similar a los tipos de datos integrados.

En el siguiente código de ejemplo, implementamos una función clearMyStruct que toma un puntero al objeto MyStruct y devuelve el mismo objeto por valor. Tenga en cuenta que necesitamos acceder a los miembros del struct utilizando el operador -> cuando el identificador es el puntero a la struct.

#include <stdio.h>
#include <stdlib.h>

enum { DAY = 9, MONTH = 2 };

typedef struct {
  int day;
  int month;
} MyStruct;

MyStruct clearMyStruct(MyStruct *st) {
  st->day = 0;
  st->month = 0;

  return *st;
}

int setMyStruct(MyStruct *st, int d, int m) {
  if (!st) return -1;
  st->day = d;
  st->month = m;
  return 0;
}

int main() {
  MyStruct tmp;

  if (setMyStruct(&tmp, DAY, MONTH) == -1) exit(EXIT_FAILURE);

  printf("day: %d\nmonth: %d\n", tmp.day, tmp.month);
  clearMyStruct(&tmp);
  printf("day: %d\nmonth: %d\n", tmp.day, tmp.month);

  exit(EXIT_SUCCESS);
}

Producción :

day: 9
month: 2
day: 0
month: 0

Utilice la notación de puntero para devolver struct de la función

Generalmente, las estructuras de datos definidas por struct tienden a contener varios miembros de datos, lo que da como resultado una gran huella de memoria. Ahora, cuando se trata de pasar estructuras relativamente grandes entre funciones, es mejor usar punteros. El puntero sirve como asa para el objeto y su tamaño es fijo independientemente de la estructura almacenada allí. El uso de punteros para devolver struct reduce potencialmente el tráfico de memoria y le da al código más rendimiento. Aunque el programa está compilado con indicadores de optimización, puede modificar implícitamente las instrucciones de paso de datos. Tenga en cuenta que utilizamos el tipo enum para declarar valores enteros constantes con nombre.

#include <stdio.h>
#include <stdlib.h>

enum { DAY = 9, MONTH = 2 };

typedef struct {
  int day;
  int month;
} MyStruct;

MyStruct *clearMyStruct2(MyStruct *st) {
  st->day = 0;
  st->month = 0;

  return st;
}

int setMyStruct(MyStruct *st, int d, int m) {
  if (!st) return -1;
  st->day = d;
  st->month = m;
  return 0;
}

int main() {
  MyStruct tmp;

  if (setMyStruct(&tmp, DAY, MONTH) == -1) exit(EXIT_FAILURE);

  printf("day: %d\nmonth: %d\n", tmp.day, tmp.month);
  clearMyStruct2(&tmp);
  printf("day: %d\nmonth: %d\n", tmp.day, tmp.month);

  exit(EXIT_SUCCESS);
}

Producción :

day: 9
month: 2
day: 0
month: 0
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C Struct