Quelle est la différence entre struct {0} et memset 0

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 des n premiers caractères de l’object pointé par s .

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