Initialiser/reset struct à zéro/null
struct x {
char a[10];
char b[20];
int i;
char *c;
char *d[10];
};
Je suis le remplissage de cette structure, puis en utilisant les valeurs. Sur la prochaine itération, je veux réinitialiser tous les champs de 0
ou null
avant de me lancer de le réutiliser.
Comment puis-je le faire? Puis-je utiliser memset
ou je dois passer par tous les membres et puis le faire individuellement?
Vous devez vous connecter pour publier un commentaire.
Définir un const instance statique de la structure avec les valeurs initiales et puis tout simplement affecter cette valeur à la variable à chaque fois que vous souhaitez réinitialiser.
Par exemple:
Ici, je me fonde sur initialisation statique à l'ensemble de mes valeurs initiales, mais vous pouvez utiliser une structure d'initialiseur si vous voulez des valeurs initiales différentes.
Ensuite, à chaque tour de la boucle, vous pouvez écrire:
memset
si je ne veux réinitialiser tout à0
??memset
me fait me sentir sale. Je préfère laisser le compilateur s'inquiéter disposition de la mémoire dans la mesure du possible. Strictement parlant, une telle utilisation dememset
est non-portable, mais dans la pratique, je serais étonné si jamais vous avez compilé votre code n'importe où ce qui comptait. Oui, vous pouvez probablement utiliser memset en toute sécurité si vous préférez.EmptyStruct
commestatic const
?memset
ne sera pas beaucoup d'aide à zéro eux.La façon de faire une telle chose quand vous avez modernes C (C99) est d'utiliser un littéral composé.
C'est un peu similaire à la solution de David, seulement que vous n'avez pas à vous inquiéter de déclarer la structure vide ou si le déclarer
static
. Si vous utilisez leconst
comme je l'ai fait, le compilateur est libre de répartir le littéral composé de manière statique dans le stockage en lecture seule, le cas échéant.struct x { int prop[3]; }; struct x a = (const struct x){ 0 };
tandis que lestartic const struct x EMPTY_STUCT
méthode ne fonctionne pas.{ 0 }
que l'initialisation par défaut. Interrupteur d'avertissement, il est fallacieux de fausse alarme.*ptr = (typeof(*ptr)){};
Mieux que tous les ci-dessus est jamais à utiliser le Standard C les spécifications pour struct initialisation:
Voici tous les bits à zéro (jamais).
{}
en C++. La gcc devs semblent pas sûr que C++ est censé supporter{0}
et je ne suis pas familier avec cette partie de la norme de moi-même.{0}
ou{}
. Vous ne savez pas si le C & C++ normes sont claires et synchroniser sur cette question, mais apparemment, les compilateurs ne sont pas.struct StructType structVar = malloc (sizeof(StructType)); structVar ={0}
x = malloc(sizeof(x)); memset(&x, 0, sizeof(x));
En C, c'est un idiome commun à zéro de la mémoire pour un
struct
à l'aide dememset
:Techniquement parlant, je ne pense pas que ce est portable car il suppose que le
NULL
pointeur sur une machine est représentée par la valeur de l'entier 0, mais il est largement utilisé car sur la plupart des machines c'est le cas.Si vous vous déplacez à partir de C à C++, attention à ne pas utiliser cette technique sur chaque objet. C++ ne fait cette juridique sur les objets sans fonctions de membre et aucun héritage.
Si vous avez un C99 conforme compilateur, vous pouvez utiliser
sinon, tu devrais faire ce que David Heffernan a écrit, c'est à dire déclarer:
Et dans la boucle:
Vous pouvez utiliser
memset
avec la taille de la structure:memset
est une option, mais lorsque vous l'utilisez, vous devez vous assurer que la mémoire de l'écrit est exactement 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 de la taille du type vous savez il actuellement est. OIEmemset (&x_instance, 0, sizeof(x_instance));
est un bien meilleur choix. BTW: le(void*)
cast est inutile en C++ aussi.Je crois que vous pouvez seulement affecter l'ensemble vide (
{}
) à votre variable.Ou si vous voulez avoir une API dans votre structure pour que vous pouvez faire:
plus tard, vous pouvez le faire: