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?
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;
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.
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).
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.
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 juste assigner l'ensemble vide ( {}
) à votre variable.
struct x instance;
for(i = 0; i < n; i++) {
instance = {};
/* Do Calculations */
}