en général, selon la norme C, il garantit que le memset () avec 0 sera nul les bits de rembourrage dans une structure C?
Quoi de GCC? P>
Par exemple, quelque chose comme: p>
3 Réponses :
Oui, Donc, si vous faites un memset code> de longueur Memset CODE> Écrit une valeur 32 bits dans une région contiguë de mémoire d'une longueur donnée à partir de l'adresse donnée. Dans votre cas, Memset écrit la région avec (valeur 32 bits)
0 code>.
Tailleof (votre_tructeur) code >, vous devriez être bien: P>
memset(&ms, 0, sizeof(struct MyStruct));
Peut-être à noter que memset code> ne sait rien de votre structure (ou de votre tableau ou de la primitive, ni de la mémoire de la mémoire que vous vous trouvez à libérer), donc même si elle voulait Pour laisser les bits de rembourrage intacts, il ne saurait même pas où ils sont. P>
Ce n'est pas vrai; Tous les compilateurs récents connaissent la sémantique du Memset code> et optimisent autour de cela, et le compilateur fait i> sur le dos où le rembourrage est.
Si cela compte, vous faites probablement quelque chose de dangereux et de non-portable. P>
oui, le memset code> L'appel définit tous les bits de remplissage (ou octets) sur 0 - mais il n'y a aucune garantie dans la langue qui définit un La norme originale ISO C90 ou C99 n'a même pas garanti que tous les bits-zéro sont une représentation valide de 0 pour les types entier; L'une des corrigendes techniques post-C99 a ajouté une telle garantie (pour les types entier uniquement). P>
Pour la portabilité, si vous voulez que quelque chose soit zéro, définissez-le explicitement. Vous pouvez également profiter de l'initialisation de la valeur zéro pour les objets statiques et des membres omis dans les initialiseurs. P>
Un Nitpick Terminologique: "Bits de rembourrage" fait partie de la représentation des types d'entier (et il n'y en a généralement pas). Le rembourrage entre les membres de la structure est le rembourrage octets em>. P> float code> objet à tous- Bits-Zero le définira à 0,0. Il en va de même pour les pointeurs: tous les bits-zéro ne sont pas garantis comme un pointeur nul. (Dans les deux cas, il s'agit de la plupart des implémentations.) P>
Pouvez-vous nous montrer un échantillon de code?
Je ne comprends pas ce qui témoigne de ça.
Puis Réponse courte: Oui. Il va zéro la région de la mémoire entière occupée par
ms code>. Bits de rembourrage et tout ...
@Mk, j'ai vu un commentaire quelque part que "ne pas les structures MEMCMP, même si vous aviez des memsser ces structures avant de les utiliser". Ce que je pensais, c'est si les bits de rembourrage sont déjà memsse à 0, il n'y aura aucun problème pour l'utilisation de MEMCMP plus tard. Peut-être la référence que j'ai trouvée est fausse.
Je pense que cela pourrait être une bonne idée de ne pas compter sur MEMCMP de comparer vos structures, car si vous envisagez de vous oublier de memsse, vous auriez une méchante difficile à trouver un bug sur vos mains. Donc, à moins qu'il ait été prouvé qu'il s'agissait d'un cou de bouteille de performance, écrivez la fonction de comparaison explicite. Imaginez également une situation où vous avez un charcuter [20] et dans une structure que vous avez définie sur "AAA" et dans une autre à "BBB", puis vous définissez les deux "C". Les structures sont maintenant logiquement égales mais MEMCMP les verra comme différents.
@Mk, merci. Maintenant, j'ai pourquoi ne devrions-nous pas comparer la structure même après le memset à 0.