struct x {
char a[10];
char b[20];
int i;
char *c;
char *d[10];
};
Je remplis cette structure, puis j'utilise les valeurs. Lors de la prochaine itération, je souhaite réinitialiser tous les champs sur 0
ou null
avant de commencer à les réutiliser.
Comment puis je faire ça? Puis-je utiliser memset
ou dois-je parcourir tous les membres et ensuite le faire individuellement?
c
struct
initialization
hari
la source
la source
memset
si je veux seulement tout réinitialiser sur0
??memset
me fait me sentir sale. Je préfère laisser le compilateur s'inquiéter de la disposition de la mémoire dans la mesure du possible. À proprement parler, une telle utilisationmemset
n'est pas portable, mais en pratique, je serais étonné si jamais vous compiliez votre code partout où cela comptait. Ainsi, vous pouvez probablement utiliser memset en toute sécurité si vous le préférez.La manière de faire une telle chose quand vous avez C moderne (C99) est d'utiliser un littéral composé .
C'est un peu similaire à la solution de David, mais vous n'avez pas à vous soucier de déclarer une structure vide ou de la déclarer
static
. Si vous utilisez leconst
comme je l'ai fait, le compilateur est libre d'allouer le littéral composé de manière statique dans le stockage en lecture seule, le cas échéant.la source
{ 0 }
comme initialiseur par défaut. Éteignez cet avertissement, il s'agit d'une fausse alarme.Mieux que tout ce qui précède, c'est d'utiliser la spécification Standard C pour l'initialisation de la structure:
Voici tous les bits zéro (jamais).
la source
{}
en C ++. Les développeurs de gcc ne semblent pas sûrs de savoir si C ++ est censé prendre en charge{0}
et je ne suis pas familier avec cette partie de la norme moi-même.{0}
ou{}
. Je ne sais pas si les normes C et C ++ sont claires et synchronisées sur ce problème, mais apparemment, les compilateurs ne le sont pas.struct StructType structVar = malloc (sizeof(StructType)); structVar ={0}
En C, il est courant de mettre à zéro la mémoire pour une
struct
utilisationmemset
:Techniquement parlant, je ne pense pas que ce soit portable car cela suppose que le
NULL
pointeur 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 du C au C ++, veillez à ne pas utiliser cette technique sur chaque objet. C ++ rend cela légal uniquement sur les objets sans fonctions membres et sans héritage.
la source
Si vous avez un compilateur compatible C99, vous pouvez utiliser
sinon vous devriez faire ce que David Heffernan a écrit, c'est-à-dire déclarer:
Et dans la boucle:
la source
Vous pouvez utiliser
memset
avec la taille de la structure:la source
memset
est une option, mais lorsque vous l'utilisez, vous devez vous assurer que la mémoire écrite est exactement de la même taille que le troisième paramètre, c'est pourquoi il est préférable de se référer à la taille de l'objet réel, pas à la taille du type que vous sachez qu'il est actuellement . IOWmemset (&x_instance, 0, sizeof(x_instance));
est un bien meilleur choix. BTW: la(void*)
distribution est également superflue en C ++.Je crois que vous pouvez simplement affecter l'ensemble vide (
{}
) à votre variable.la source
la source
entrez la description de l'image ici Prenez une surprise de gnu11!
rien n'est nul.
la source