Restituisce una funzione Struct From in C
-
Usa la notazione standard per restituire
struct
dalla funzione -
Usa la notazione puntatore per restituire
struct
dalla funzione
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
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