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?
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;
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.
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).
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.
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;
Vous pouvez utiliser memset
avec la taille de la structure:
struct x x_instance;
memset (&x_instance, 0, sizeof(x_instance));
Je crois que vous pouvez simplement assigner le jeu vide ({}
) à votre variable.
struct x instance;
for(i = 0; i < n; i++) {
instance = {};
/* Do Calculations */
}
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()
struct x myX;
...
memset(&x, 0, sizeof(myX));