Seltsame Verwendung von geschweiften Klammern in C

Lesezeit: 3 Minuten

Benutzer-Avatar
John

Entschuldigung für die einfache Frage, aber ich bin im Urlaub und lese ein Buch über Core Audio und habe meine C- oder Objective-C-Bücher nicht dabei …

Was machen die geschweiften Klammern in dieser Variablendefinition?

MyRecorder recorder = {0};

  • Ich nenne die gerne {0}das universeller Nullinitialisierer. Es “funktioniert”, bei Bedarf rekursiv, für jeden Typ! ints, doubles, structs, Arrays, Zeiger, Zeiger auf Strukturen, Strukturen mit Arrays von Zeigern, …, …

    – pmg

    5. Januar 2012 um 15:26 Uhr


  • @pmg — warum hast du deinen Kommentar nicht als Antwort gepostet?

    – vikingosegundo

    5. Januar 2012 um 15:31 Uhr

  • Mein Kommentar ist wirklich keine Antwort: Er erklärt nichts, er weist lediglich auf eine andere Verwendung des Konstrukts hin – und den Namen, den ich diesem Konstrukt gebe. Erkläre auch wie {0} ist anders als {42} und wie sie sich auf Arrays oder verschachtelte Strukturen oder andere “seltsame” Typen beziehen, würde eine sehr lange Antwort erfordern.

    – pmg

    5. Januar 2012 um 15:38 Uhr

Benutzer-Avatar
Niklas B.

Vorausgesetzt, dass MyRecorder ist ein structDies setzt jedes Mitglied auf seine jeweilige Darstellung von Null (0 für ganze Zahlen, NULL für Zeiger etc.).

Eigentlich funktioniert das auch bei allen anderen Datentypen wie int, doubleZeiger, Arrays, verschachtelte Strukturen, …, alles, was Sie sich vorstellen können (danke an pmg für den Hinweis!)

AKTUALISIEREN: Ein Zitat aus der oben verlinkten Website unter Berufung auf den endgültigen Entwurf von C99:

[6.7.8.21] Wenn eine in geschweiften Klammern eingeschlossene Liste weniger Initialisierer enthält als Elemente oder Mitglieder eines Aggregats, […] der Rest des Aggregats wird implizit genauso initialisiert wie Objekte mit statischer Speicherdauer.

  • Strukturmitglieder haben keine Standardwerte: es kann besser sein, explizit Null zu sagen — “setzt jedes Mitglied auf (die richtige Art von) Null”.

    – pmg

    5. Januar 2012 um 15:31 Uhr

  • Ah! Kühl. Das macht Sinn. Vielen Dank.

    – John

    5. Januar 2012 um 15:39 Uhr

Benutzer-Avatar
Shiplu Mokadim

Seine Initialisierung alle Mitglieder von recorder Struktur zu 0 nach C99-Standard. Es scheint, dass es jedes Bit der Struktur mit initialisiert 0 Bits. Aber das gilt nicht für jeden Compiler.

Siehe diesen Beispielcode,

#include<stdio.h>

struct s {
    int i;
    unsigned long l;
    double d;
};

int main(){
    struct s es = {0};
    printf("%d\n", es.i);
    printf("%lu\n", es.l);
    printf("%f\n", es.d);
    return 0;
}

Dies ist die Ausgabe.

$ ./a.out 
0
0
0.000000

  • “Es initialisiert alle Mitglieder der Recorder-Struktur auf 0.” ist in Anwendung des C99-Standards. “Tatsächlich initialisiert es jedes Bit der Struktur mit 0 Bits.” ist in der Praxis nur auf herkömmlichen Architekturen wahr, und der C99-Standard weist mehrfach darauf hin, dass er nicht sagt, dass es wahr ist, und dass ein standardkonformer Compiler/eine Zielarchitektur es nicht wahr machen muss.

    – Pascal Cuoq

    5. Januar 2012 um 17:28 Uhr

es ist eine Initialisierung einer Struktur.

  • könnte auch ein Skalar sein: MyRecorder recorder = {0}; wo MyRecorder ist ein Pseudonym von int zum Beispiel ist in C gültig

    – au

    5. Januar 2012 um 15:34 Uhr

  • @ouah Dem Namen nach zu urteilen structich sage es ist sehr unwahrscheinlich dass es ein ist int oder tatsächlich etwas anderes als eine Struktur/Vereinigung.

    – Sergej Kalinitschenko

    5. Januar 2012 um 15:35 Uhr


Tatsächlich werden nicht alle Elemente der Struktur initialisiert, sondern nur das erste. Die anderen werden jedoch automatisch mit 0 initialisiert, da dies vom C-Standard verlangt wird.

Wenn Sie setzen: MyRecorder recorder = {3};

Das erste Element wird 3 sein und die anderen werden 0 sein.

MyRecorder könnte eine der folgenden sein und Sie versuchen, alle Elemente davon mit Null zu initialisieren

typedef struct _MyRecorder1 {
    int i;
    int j;
    int k;
}MyRecorder1;

typedef int MyRecorder2[3];

Im Gegensatz zu C++11 muss in C99 mindestens ein Element in Initialisierungsklammern stehen.

C++11-Struktur:

MyRecorder recorder{};

C-Struktur:

MyRecorder recorder = {0};

1373840cookie-checkSeltsame Verwendung von geschweiften Klammern in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy