Restituisce una funzione Struct From in C

Jinku Hu 12 ottobre 2023
  1. Usa la notazione standard per restituire struct dalla funzione
  2. Usa la notazione puntatore per restituire struct dalla funzione
Restituisce una funzione Struct From in C

Questo articolo mostrerà diversi metodi su come restituire una struttura da una funzione in C.

Usa la notazione standard per restituire struct dalla funzione

La parola chiave struct in C viene utilizzata per implementare strutture di dati definite dall’utente. Dato che definiamo il tipo struct in questo esempio, sarà una notazione più pulita per le dichiarazioni di funzione se typedef la struttura MyStruct. Associerà un nuovo alias di tipo per la struttura data e avremmo bisogno di specificare solo il nuovo nome alias nel prototipo della funzione. Ora, le funzioni in C possono restituire la struct simile ai tipi di dati incorporati.

Nel seguente codice di esempio, abbiamo implementato una funzione clearMyStruct che prende un puntatore all’oggetto MyStruct e restituisce lo stesso oggetto per valore. Nota che dobbiamo accedere ai membri della struttura usando l’operatore -> quando l’handle è il puntatore alla 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);
}

Produzione:

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

Usa la notazione puntatore per restituire struct dalla funzione

In generale, le strutture di dati definite da struct tendono a contenere più membri di dati, con conseguente grande impronta di memoria. Ora, quando si tratta di passare strutture relativamente grandi tra le funzioni, è meglio usare i puntatori. Il puntatore funge da maniglia per l’oggetto e la sua dimensione è fissa indipendentemente dalla struttura memorizzata. L’uso di puntatori per restituire struct riduce potenzialmente il traffico di memoria e fornisce al codice maggiori prestazioni. Sebbene il programma sia compilato con flag di ottimizzazione, può implicitamente modificare le istruzioni di passaggio dei dati. Notare che abbiamo utilizzato il tipo enum per dichiarare valori interi costanti denominati.

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

Produzione:

day: 9
month: 2
day: 0
month: 0
Autore: 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

Articolo correlato - C Struct