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};
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};
Niklas B.
Vorausgesetzt, dass MyRecorder
ist ein struct
Dies 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
, double
Zeiger, 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
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
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 struct
ich 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};
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