Comment une fonction peut-elle créer une structure?

L’une de mes tâches pour le cours de programmation en C consistait à définir une fonction appelée create_card. Cette fonction reçoit un caractère de combinaison et une valeur de carte et renvoie une structure card_t.

Question: Comment une fonction est-elle supposée créer une structure? Ne peut-il pas uniquement créer des valeurs pour la structure? Ai-je mal interprété le sens de la question ou la cession a-t-elle été mal écrite?

Voici un exemple de fonction renvoyant une structure.

struct test { int a; }; struct test Fun(int k) { struct test d; da=k; return d; } 

Remplacez struct test par le nom de votre structure et la définition de struct test par la définition de votre structure.

Comment utiliser

 int main() { struct test Test=Fun(6); printf("%d",Test.a); // prints '6' return 0; } 

Vous pouvez soit renvoyer une struct partir d’une fonction comme dans la réponse de ForceBru , soit créer une struct en mémoire dynamic C (alias heap), à l’aide de malloc , et lui renvoyer un pointeur, par exemple

 struct foo_st { int num; const char* str; }; struct foo_st* /* the second argument s should practically be a literal ssortingng */ make_foo (int n, const char* s) { struct foo_st* p = malloc(sizeof(struct foo_st)); if (!p) { perror("malloc foo"); exit(EXIT_FAILURE); }; p->num = n; p->str = s; return p; } 

Votre fonction main (ou une autre fonction) pourrait plus tard faire struct foo_st*fooptr = make_foo(32, "abc"); mais quelqu’un doit appeler free(fooptr) (ou au moins free l’adresse qui était à l’intérieur de fooptr ).

Bien sûr, vous ne devriez jamais oublier de free un pointeur mallocable quand il devient inutile. Craignez les memory leaks , le dépassement de mémoire tampon et les comportements indéfinis . En savoir plus sur malloc (3) & free .

BTW, en pratique, vous devez décider qui est responsable de free libération de la mémoire. Dans l’exemple de make_foo ci-dessus, le deuxième paramètre de make_foo est censé être une chaîne littérale (s’il est mallocable, par exemple en utilisant strdup (3) , vous devrez le free ailleurs, et cela devient très compliqué).

Dans la pratique, vous devez documenter les conventions relatives à la responsabilité de free mémoire dynamicment malloc auparavant. Vous voudrez peut-être utiliser valgrind (si votre système en est doté) et, si vous utilisez un compilateur GCC récent, son option -fsanitize = address pour rechercher les bogues liés à la mémoire. Très souvent, il vous arrive de coder à la fois la création et la destruction de fonctions (comme ici ou ici ).

Vous voudrez peut-être en savoir plus sur la récupération de place (au moins pour comprendre les concepts tels que le comptage des références et la terminologie). Peut-être voudrez-vous plus tard utiliser le récupérateur de déchets conservateur de Boehm .