209 votes

Comment comparer des structs pour l'égalité en C ?

Comment comparer deux instances de structs pour l'égalité en C standard ?

4voto

pixelbeat Points 12073

Notez que vous pouvez utiliser memcmp() sur des structures non statiques sans sans se préoccuper du padding, tant que vous n'initialisez pas tous les membres (en une seule fois). Ceci est défini par C90 :

http://www.pixelbeat.org/programming/gcc/auto_init.html

3voto

domgblackwell Points 2333

Cela dépend si la question que vous posez est :

  1. Ces deux structs sont-ils le même objet ?
  2. Ont-ils la même valeur ?

Pour savoir s'il s'agit du même objet, il faut comparer les pointeurs des deux structs pour vérifier leur égalité. Si vous voulez savoir en général s'ils ont la même valeur, vous devez effectuer une comparaison approfondie. Cela implique la comparaison de tous les membres. Si les membres sont des pointeurs vers d'autres structs, vous devez également effectuer une récursion dans ces structs.

Dans le cas particulier où les structs ne contiennent pas de pointeurs, vous pouvez faire un memcmp pour effectuer une comparaison par bit des données contenues dans chacun d'eux sans avoir à savoir ce que les données signifient.

Assurez-vous de savoir ce que signifie "égal" pour chaque membre - c'est évident pour les ints mais plus subtil lorsqu'il s'agit de valeurs à virgule flottante ou de types définis par l'utilisateur.

2voto

sergio Points 51

memcmp ne compare pas la structure, memcmp compare le binaire, et il y a toujours des déchets dans la structure, donc le résultat est toujours faux en comparaison.

En comparant élément par élément, on constate que c'est sûr et qu'il n'y a pas de défaillance.

0voto

Kevin S. Points 610

Si les structs ne contiennent que des primitives ou si vous êtes intéressé par une égalité stricte, vous pouvez faire quelque chose comme ceci :

int my\_struct\_cmp(const struct my\_struct \* lhs, const struct my\_struct \* rhs)
{
    return memcmp(lhs, rsh, sizeof(struct my\_struct));
}

Cependant, si vos structs contiennent des pointeurs vers d'autres structs ou unions, vous devrez écrire une fonction qui compare correctement les primitives et effectue des appels de comparaison contre les autres structures, le cas échéant.

Sachez toutefois que vous auriez dû utiliser memset(&a, sizeof(struct my_struct), 1) pour remettre à zéro la plage de mémoire des structures dans le cadre de l'initialisation de votre ADT.

-2voto

MOHAMED Points 11753

Si les 2 structures sont initialisées avec calloc ou mises à 0 par memset alors vous pouvez comparer vos 2 structures avec memcmp et il n'y a pas de souci de structure garbage et cela vous permettra de gagner du temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X