struct x {
char a[10];
char b[20];
int i;
char *c;
char *d[10];
};
Ich fülle diese Struktur und benutze dann die Werte. Bei der nächsten Iteration möchte ich alle Felder auf 0
oder null
vor der Wiederverwendung zurücksetzen .
Wie kann ich das machen? Kann ich verwenden memset
oder muss ich alle Mitglieder durchgehen und es dann einzeln tun?
c
struct
initialization
Hari
quelle
quelle
memset
wenn ich nur alles zurücksetzen möchte0
?memset
ich es benutze, fühle ich mich schmutzig. Ich ziehe es vor, den Compiler nach Möglichkeit um das Speicherlayout kümmern zu lassen. Genau genommen ist eine solche Verwendungmemset
nicht portierbar, aber in der Praxis wäre ich erstaunt, wenn Sie Ihren Code jemals irgendwo kompilieren würden, wo es darauf ankommt. Sie können memset also wahrscheinlich sicher verwenden, wenn Sie es bevorzugen.Wenn Sie ein modernes C (C99) haben, können Sie so etwas tun, indem Sie ein zusammengesetztes Literal verwenden .
Dies ist etwas ähnlich wie Davids Lösung, nur dass Sie sich keine Sorgen machen müssen, um eine leere Struktur zu deklarieren oder ob Sie sie deklarieren möchten
static
. Wenn Sie dasconst
wie ich verwenden, kann der Compiler das zusammengesetzte Literal gegebenenfalls statisch im Nur-Lese-Speicher zuweisen.quelle
{ 0 }
als Standardinitialisierer vor. Schalten Sie diese Warnung aus, es handelt sich um einen falschen Fehlalarm.Besser als alle oben genannten ist es, jemals die Standard C-Spezifikation für die Strukturinitialisierung zu verwenden:
Hier sind alle Bits Null (je).
quelle
{}
in C ++ verwenden. Die gcc-Entwickler scheinen sich nicht sicher zu sein, ob C ++ unterstützt werden soll,{0}
und ich bin mit diesem Teil des Standards selbst nicht vertraut.{0}
oder gab{}
. Ich bin mir nicht sicher, ob die C & C ++ - Standards in diesem Punkt klar und synchron sind, aber anscheinend sind Compiler dies nicht.struct StructType structVar = malloc (sizeof(StructType)); structVar ={0}
In C ist es eine gängige Redewendung, den Speicher für eine
struct
Verwendung auf Null zu setzenmemset
:Technisch gesehen glaube ich nicht, dass dies portabel ist, da davon ausgegangen wird, dass der
NULL
Zeiger auf einem Computer durch den ganzzahligen Wert 0 dargestellt wird, aber er wird häufig verwendet, da dies auf den meisten Computern der Fall ist.Wenn Sie von C nach C ++ wechseln, achten Sie darauf, diese Technik nicht bei jedem Objekt anzuwenden. C ++ macht dies nur für Objekte ohne Elementfunktionen und ohne Vererbung zulässig.
quelle
Wenn Sie einen C99-kompatiblen Compiler haben, können Sie diesen verwenden
Andernfalls sollten Sie das tun, was David Heffernan geschrieben hat, dh erklären:
Und auf dem Laufenden:
quelle
Sie können
memset
mit der Größe der Struktur verwenden:quelle
memset
ist eine Option, aber wenn Sie sie verwenden, müssen Sie sicherstellen, dass der Speicher, in den geschrieben wird, genau die gleiche Größe wie der dritte Parameter hat. Deshalb ist es besser, sich auf die Größe des tatsächlichen Objekts zu beziehen, nicht auf die Größe des Typs, den Sie verwenden weiß es aktuell ist. IOWmemset (&x_instance, 0, sizeof(x_instance));
ist eine viel bessere Wahl. Übrigens: Die(void*)
Besetzung ist auch in C ++ überflüssig.Ich glaube, Sie können
{}
Ihrer Variablen einfach die leere Menge ( ) zuweisen .quelle
quelle
Bildbeschreibung hier eingeben Überraschen Sie gnu11!
nichts ist null.
quelle