Initialiser / réinitialiser struct à zéro / null

struct x {
    char a[10];
    char b[20];
    int i;
    char *c;
    char *d[10];
};

je remplis cette structure et j'utilise ensuite les valeurs. Sur la prochaine itération, je veux réinitialiser tous les champs à 0 ou null avant de commencer à le réutiliser.

Comment faire? Puis-je utiliser memset ou je dois passer par tous les membres et puis le faire individuellement?

71
demandé sur templatetypedef 2011-07-31 23:20:32

8 réponses

définissez une instance statique de const de la structure avec les valeurs initiales et ensuite assignez simplement cette valeur à votre variable chaque fois que vous voulez la Réinitialiser.

par exemple:

static const struct x EmptyStruct;

ici je m'appuie sur initialisation statique pour définir mes valeurs initiales, mais vous pouvez utiliser un initialiseur struct si vous voulez des valeurs initiales différentes.

Ensuite, chaque fois que vous contournez la boucle, vous pouvez écrire:

myStructVariable = EmptyStruct;
88
répondu David Heffernan 2017-05-23 10:31:31

la façon de faire une telle chose quand vous avez le C moderne (C99) est d'utiliser un composé littéral .

a = (const struct x){ 0 };

c'est quelque peu similaire à la solution de David, seulement que vous n'avez pas à vous inquiéter de déclarer une structure vide ou si de le déclarer static . Si vous utilisez le const comme je l'ai fait, le compilateur est libre d'allouer le composé de façon statique en lecture seule si nécessaire.

65
répondu Jens Gustedt 2011-07-31 20:12:53

mieux que tout ce qui précède est d'utiliser la spécification Standard C pour l'initialisation de la structure:

struct StructType structVar = {0};

Voici tous les bits à zéro (jamais).

45
répondu user411313 2011-07-31 19:30:17

En C, c'est un idiome commun à zéro de la mémoire pour un struct à l'aide memset :

struct x myStruct;
memset(&myStruct, 0, sizeof(myStruct));

techniquement parlant, Je ne crois pas que ce soit portable parce qu'il suppose que le pointeur NULL sur une machine est représenté par la valeur entière 0, mais il est largement utilisé parce que sur la plupart des machines c'est le cas.

si vous passez de C à C++, faites attention de ne pas utiliser cette technique sur chaque objet. C++ fait seulement ce légal sur les objets sans fonctions de membre et aucun héritage.

33
répondu templatetypedef 2011-07-31 19:23:34

si vous avez un compilateur compatible C99, vous pouvez utiliser

mystruct = (struct x){0};

sinon vous devriez faire ce que David Heffernan a écrit, c'est-à-dire déclarer:

struct x empty = {0};

et dans la boucle:

mystruct = empty;
13
répondu Rudy Velthuis 2015-02-04 06:31:17

Vous pouvez utiliser memset avec la taille de la structure:

struct x x_instance;
memset (&x_instance, 0, sizeof(x_instance));
4
répondu Diego Sevilla 2016-06-22 21:53:21

je crois que vous pouvez juste assigner l'ensemble vide ( {} ) à votre variable.

struct x instance;

for(i = 0; i < n; i++) {
    instance = {};
    /* Do Calculations */
}
1
répondu Archmede 2017-05-27 23:49:53
 struct x myX;
 ...
 memset(&x, 0, sizeof(myX));
0
répondu Josh Matthews 2011-07-31 19:23:35