Est-il garanti que memset mettra à zéro les bits de remplissage d’une structure?

En général, conformément à la norme C, est-il garanti que memset () avec 0 mettra à zéro les bits de remplissage dans une structure C?

Qu’en est-il de gcc?

Par exemple, quelque chose comme:

struct MyStruct { unsigned char member1; unsigned int member2; char member3; unsigned char member4; float member5; }; struct MyStruct ms; memset(&ms, 0, sizeof( struct MyStruct)); 

Il est peut-être intéressant de noter que memset ne sait rien de votre structure (ni de votre tableau, ni de votre primitive, ni d’aucun morceau de mémoire sur lequel vous le lâchez), donc même s’il voulait laisser les bits de remplissage intacts, il ne le ferait pas. t même savoir où ils sont.

Oui, memset écrit une valeur de 32 bits dans une région de mémoire contiguë d’une longueur donnée commençant à l’adresse donnée. Dans votre cas, memset écrit la région avec (valeur 32 bits) 0 .

Donc si vous faites un memset de longueur sizeof (your_struct) , vous devriez aller bien:

 memset(&ms, 0, sizeof(struct MyStruct)); 

Si cela compte, vous faites probablement quelque chose de dangereux et de non portable.

Oui, l’appel memset définira tous les bits de remplissage (ou octets) sur 0 – mais rien ne garantit dans la langue que la définition d’un object float sur all-bits-zero le définisse sur 0.0. La même chose s’applique aux pointeurs: il n’est pas garanti que tout-bits-zéro soit un pointeur nul. (Dans les deux cas, c’est le cas pour la plupart des implémentations.)

La norme ISO C90 ou C99 d’origine ne garantissait même pas que zéro entier est une représentation valide de 0 pour les types entiers; l’un des corrigenda techniques postérieur à C99 a ajouté une telle garantie (pour les types entiers uniquement).

Pour la portabilité, si vous voulez que quelque chose soit égal à zéro, définissez-le explicitement. Vous pouvez également tirer parti de l’initialisation de la valeur zéro pour les objects statiques et pour les membres omis dans les initialiseurs.

Un nitpick terminologique: les “bits de remplissage” font partie de la représentation des types entiers (et généralement, il n’en existe aucun). Le rembourrage entre les membres de la structure correspond au remplissage des octets .