642 Stimmen

Initialisierung einer Struktur in Übereinstimmung mit den Standards der Programmiersprache C

Ich möchte ein struct-Element initialisieren, aufgeteilt in Deklaration und Initialisierung. Dies ist, was ich habe:

typedef struct MY_TYPE {
  bool flag;
  short int value;
  double stuff;
} MY_TYPE;

void function(void) {
  MY_TYPE a;
  ...
  a = { true, 15, 0.123 }
}

Ist dies der Weg, um eine lokale Variable von MY_TYPE in Übereinstimmung mit den Standards der Programmiersprache C (C89, C90, C99, C11, etc.)? Oder gibt es etwas Besseres oder zumindest Funktionierendes?

Update Am Ende hatte ich ein statisches Initialisierungselement, in dem ich jedes Unterelement nach meinen Bedürfnissen einstellte.

1023voto

philant Punkte 32877

In (ANSI) C99 können Sie eine designierter Initialisierer um eine Struktur zu initialisieren:

MY_TYPE a = { .flag = true, .value = 123, .stuff = 0.456 };

Andere Mitglieder werden mit Null initialisiert: "Ausgelassene Feldmitglieder werden implizit genauso initialisiert wie Objekte, die eine statische Speicherdauer haben." ( https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html )

276voto

CesarB Punkte 41671

Sie können es mit einer zusammengesetztes Literal . Laut dieser Seite funktioniert es in C99 (was auch als ANSI C ).

MY_TYPE a;

a = (MY_TYPE) { .flag = true, .value = 123, .stuff = 0.456 };
...
a = (MY_TYPE) { .value = 234, .stuff = 1.234, .flag = false };

Die Bezeichnungen in den Initialisierern sind optional; Sie könnten auch schreiben:

a = (MY_TYPE) { true,  123, 0.456 };
...
a = (MY_TYPE) { false, 234, 1.234 };

120voto

Ron Nuni Punkte 1585

Wie ich sehe, haben Sie bereits eine Antwort zu ANSI C 99 erhalten, also werde ich Ihnen eine Antwort zu ANSI C 89 geben. ANSI C 89 erlaubt Ihnen, eine Struktur auf diese Weise zu initialisieren:

typedef struct Item {
    int a;
    float b;
    char* name;
} Item;

int main(void) {
    Item item = { 5, 2.2, "George" };
    return 0;
}

Es ist wichtig, sich daran zu erinnern, dass in dem Moment, in dem Sie auch nur ein Objekt/eine Variable in der Struktur initialisieren, alle anderen Variablen mit dem Standardwert initialisiert werden.

Wenn Sie die Werte in Ihrer Struktur nicht initialisieren, werden alle Variablen "Müllwerte" enthalten.

Viel Glück!

52voto

qrdl Punkte 32507

a = (MYTYPE){ true, 15, 0.123 };

würde in C99 gut funktionieren

34voto

Federico Baù Punkte 3486

Zusätzlich zu all diesen guten Antworten eine Zusammenfassung, wie man eine Struktur (Union und Array) in C initialisiert, mit besonderem Augenmerk auf den Designed Initializer.

Standard-Initialisierung

struct point 
{
    double x;
    double y;
    double z;
}

p = {1.2, 1.3}; 

Bezeichneter Initialisierer

Der Designated Initializer ist seit ISO C99 aufgetaucht und ist eine andere und dynamischere Art, in C zu initialisieren, wenn man struct , union oder ein array .

Der größte Unterschied zur Standardinitialisierung besteht darin, dass Sie die Elemente nicht in einer festen Reihenfolge deklarieren müssen und dass Sie auch Elemente weglassen können.

Von der GNU-Leitfaden :

Der C90-Standard verlangt, dass die Elemente eines Initialisierers in einer festen Reihenfolge erscheinen, die der Reihenfolge der Elemente in dem zu initialisierenden Array oder der Struktur entspricht.

In ISO C99 kann man die Elemente in zufälliger Reihenfolge angeben, indem man die Array-Indizes oder Strukturfeldnamen angibt, auf die sie sich beziehen, und GNU C erlaubt dies als Erweiterung auch im C90-Modus


事例紹介

1. Array-Index

Standard-Initialisierung

int a[6] = { 0, 0, 15, 0, 29, 0 };

Bezeichnete Initialisierung

int a[6] = {[4] = 29, [2] = 15 }; // or
int a[6] = {[4]29 , [2]15 }; // or
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

2. Struktur oder Vereinigung:

Standard-Initialisierung

struct point { int x, y; };

Bezeichnete Initialisierung

struct point p = { .y = 2, .x = 3 }; or
struct point p = { y: 2, x: 3 };

3. Kombinieren Sie die Benennung von Elementen mit der normalen C-Initialisierung aufeinanderfolgender Elemente:

Standard-Initialisierung

int a[6] = { 0, v1, v2, 0, v4, 0 };

Bezeichnete Initialisierung

int a[6] = { [1] = v1, v2, [4] = v4 };

4. Andere:

Beschriftung der Elemente eines Array-Initialisierers

int whitespace[256] = { [' '] = 1, ['\t'] = 1, ['\h'] = 1,
                        ['\f'] = 1, ['\n'] = 1, ['\r'] = 1 };

eine Reihe von '.fieldname' und '[index]' Bezeichnern vor ein '=' schreiben, um ein verschachteltes Unterobjekt zu initialisieren

struct point ptarray[10] = { [2].y = yv2, [2].x = xv2, [0].x = xv0 };

Leitfäden

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X