wake-up-neo.com

Struktur initialisieren/zurücksetzen auf null/null

struct x {
    char a[10];
    char b[20];
    int i;
    char *c;
    char *d[10];
};

Ich fülle diese Struktur und verwende dann die Werte. Bei der nächsten Iteration möchte ich alle Felder auf 0 oder null zurücksetzen, bevor ich mit der Wiederverwendung beginne. 

Wie kann ich das machen? Kann ich memset verwenden oder muss ich alle Mitglieder einzeln durchgehen?

76
hari

Definieren Sie eine statische const-Instanz der Struktur mit den Anfangswerten, und weisen Sie diese dann einfach Ihrer Variablen zu, wenn Sie sie zurücksetzen möchten.

Zum Beispiel:

static const struct x EmptyStruct;

Hier verlasse ich mich auf statische Initialisierung , um meine Anfangswerte festzulegen, aber Sie könnten einen Struktur-Initialisierer verwenden, wenn Sie andere Anfangswerte wünschen.

Dann können Sie jedes Mal um die Schleife schreiben:

myStructVariable = EmptyStruct;
91
David Heffernan

Wenn Sie modernes C (C99) verwenden, können Sie dies mit einem zusammengesetzten Literal tun.

a = (const struct x){ 0 };

Dies ist etwas ähnlich zu Davids Lösung, nur dass Sie sich keine Sorgen machen müssen, eine leere Struktur zu deklarieren oder ob Sie sie als static deklarieren. Wenn Sie die Variable const wie ich verwenden, kann der Compiler das zusammengesetzte Literal ggf. statisch im Nur-Lese-Speicher zuordnen.

69
Jens Gustedt

Besser als alle anderen ist es, die Standard-C-Spezifikation zur Strukturinitialisierung zu verwenden:

struct StructType structVar = {0};

Hier sind alle Bits null (je).

47
user411313

In C ist es üblich, den Speicher für eine struct mit memset auf Null zu setzen:

struct x myStruct;
memset(&myStruct, 0, sizeof(myStruct));

Technisch gesehen glaube ich nicht, dass dies portabel ist, da davon ausgegangen wird, dass der NULL -Zeiger auf einer Maschine durch den ganzzahligen Wert 0 dargestellt wird. Er wird jedoch häufig verwendet, da dies auf den meisten Maschinen der Fall ist.

Wenn Sie von C zu C++ wechseln, sollten Sie diese Technik nicht für jedes Objekt verwenden. C++ macht dies nur für Objekte zulässig, die keine Mitgliederfunktionen und keine Vererbung haben.

33
templatetypedef

Wenn Sie einen C99-kompatiblen Compiler haben, können Sie verwenden

mystruct = (struct x){0};

ansonsten sollten Sie tun, was David Heffernan schrieb, d. h.

struct x empty = {0};

Und in der Schleife:

mystruct = empty;
13
Rudy Velthuis

Sie können memset mit der Größe der Struktur verwenden:

struct x x_instance;
memset (&x_instance, 0, sizeof(x_instance));
5
Diego Sevilla

Ich glaube, Sie können Ihrer Variablen einfach den leeren Satz ({}) zuweisen.

struct x instance;

for(i = 0; i < n; i++) {
    instance = {};
    /* Do Calculations */
}
2
Archmede

Oder wenn Sie eine API in Ihrer Struktur haben möchten, können Sie dies tun:

struct Register {
    ..
    ..
    void reset() { *this = {}; }
    ..
}

so kannst du das später machen:

Register reg;
// do some work
reg.reset()
0
gatis paeglis
 struct x myX;
 ...
 memset(&x, 0, sizeof(myX));
0
Josh Matthews