web-dev-qa-db-fra.com

Initialiser/remettre à zéro la structure

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

Je remplis cette structure, puis j'utilise les valeurs. À la prochaine itération, je souhaite réinitialiser tous les champs à 0 ou null avant de commencer à les réutiliser. 

Comment puis je faire ça? Puis-je utiliser memset ou je dois passer en revue tous les membres, puis le faire individuellement?

76
hari

Définissez une instance statique const de la structure avec les valeurs initiales, puis affectez simplement cette valeur à votre variable chaque fois que vous souhaitez la réinitialiser.

Par exemple:

static const struct x EmptyStruct;

Ici, je me fie à initialisation statique pour définir mes valeurs initiales, mais vous pouvez utiliser un initialiseur de structure si vous voulez des valeurs initiales différentes.

Ensuite, à chaque tour de la boucle, vous pouvez écrire:

myStructVariable = EmptyStruct;
91
David Heffernan

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 };

Ceci est un peu similaire à la solution de David, sauf que vous n'avez pas à craindre de déclarer une structure vide ou de la déclarer static. Si vous utilisez la variable const comme je l'ai fait, le compilateur est libre d'allouer le littéral composé de manière statique dans un stockage en lecture seule, le cas échéant.

69
Jens Gustedt

Il est préférable d'utiliser la spécification Standard C pour l'initialisation de la structure:

struct StructType structVar = {0};

Voici tous les bits zéro (jamais).

47
user411313

En C, il est courant de mettre à zéro la mémoire de struct en utilisant memset:

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

Techniquement parlant, je ne pense pas que cela soit portable car cela suppose que le pointeur NULL sur une machine est représenté par la valeur entière 0, mais il est largement utilisé car c'est le cas sur la plupart des machines.

Si vous passez de C à C++, veillez à ne pas utiliser cette technique sur chaque objet. C++ rend cela uniquement légal sur des objets sans fonctions membres ni héritage.

33
templatetypedef

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
Rudy Velthuis

Vous pouvez utiliser memset avec la taille de la structure:

struct x x_instance;
memset (&x_instance, 0, sizeof(x_instance));
5
Diego Sevilla

Je crois que vous pouvez simplement assigner le jeu vide ({}) à votre variable.

struct x instance;

for(i = 0; i < n; i++) {
    instance = {};
    /* Do Calculations */
}
2
Archmede

Ou si vous voulez avoir une API dans votre structure pour cela, vous pouvez faire:

struct Register {
    ..
    ..
    void reset() { *this = {}; }
    ..
}

alors plus tard, vous pouvez faire ceci:

Register reg;
// do some work
reg.reset()
0
gatis paeglis
 struct x myX;
 ...
 memset(&x, 0, sizeof(myX));
0
Josh Matthews