Dupliquer possible:
Lequel utiliser – memset () ou l’initialisation de la valeur pour mettre à zéro une structure?
Supposons que nous ayons une structure comme celle-ci:
struct A { int x; int y; };
quelle est la différence entre
A a = {0};
et
A a; memset(&a,0,sizeof(A));
Aucun. Le résultat final est que les deux membres initialisent les membres de la structure sur 0
.
Norme C99 6.7.8.21
Si la liste entourée d’accolades contient moins d’initialiseurs que d’éléments ou de membres d’un agrégat, ou moins de caractères dans un littéral de chaîne utilisé pour initialiser un tableau de taille connue par rapport au nombre d’éléments contenus dans le tableau, le rest de l’agrégat doit être initialisé implicitement de la même façon que les objects ayant une durée de stockage statique.
Votre structure A
est un agrégat et la règle ci-dessus s’applique à elle. Tous les membres de la structure sont donc initialisés avec la même valeur que pour la durée de stockage statique. Qui est 0
.
C99 Standard 7.21.6.1 La fonction memset:
void *memset(void *s, int c, size_t n);
La fonction memset copie la valeur de
c
(convertie en caractère non signé) dans chacun desn
premiers caractères de l’object pointé pars
.
En termes simples, tous les membres, y compris les bits d’alignement / remplissage dans l’object de votre structure A
sont mis à 0
.
Notez que la seule différence entre les deux constructions en C est que memset
définit également l’alignement / le remplissage sur 0
, tandis que l’initialisation de l’agrégat garantit uniquement que les membres de votre structure sont définis sur 0
.
Dans les deux cas, vous n’avez pas access aux octets d’alignement / remplissage par le biais des constructions de langage de convention et vous obtenez donc le même effet.
Les deux mettent la mémoire à 0
Le premier sert à définir uniquement une mémoire d’allocation statique sur 0
A a ={0}; // set a staic memory to 0
Et vous ne pouvez pas le faire de cette façon:
A *a = malloc(sizeof(A)); a = {0} // This could not be done
Le second sert à définir la mémoire d’allocation dynamic et statique sur 0
A a; memset(&a,0,sizeof(A));
Et vous pourriez faire aussi
A *a = malloc(sizeof(A)); memset(a,0,sizeof(A));
Autre chose
lorsque vous utilisez memset
pour régler votre mémoire sur 0
, vous appelez une fonction (et cela prend du temps). Et lorsque vous définissez avec {0}
, vous n’appelez pas de fonction. Donc, le {0}
pourrait être plus rapide que memset