In C können Sie teilweise eine Struktur oder ein Array initialisieren, mit dem Ergebnis, dass die Member/Elemente, die nicht im Initialisierer erwähnt werden, Null initialisiert werden. (C99 Abschnitt 6.7.8.19). Zum Beispiel: -Zählt ein String-Literal als Teilinitialisierer und Nullinitialisierung?
int a[4] = {1, 2};
// a[0] == 1
// a[1] == 2
// a[2] == 0
// a[3] == 0
Sie können auch als „eine Anordnung von Zeichentyp“ mit einem Stringliteral (C99 Abschnitt 6.7.8.14) initialisieren, und „... aufeinanderfolgende Zeichen, die Elemente des Arrays initialisieren“. Zum Beispiel: -
char b[4] = "abc";
// b[0] == 'a'
// b[1] == 'b'
// b[2] == 'c'
// b[3] == '\0'
Alles ziemlich einfach. Was passiert aber, wenn Sie explizit die Länge des Arrays angeben, aber ein Literal verwenden, das zu kurz ist, um das Array zu füllen? Sind die verbleibenden Zeichen null-initialisiert oder haben sie undefinierte Werte?
char c[4] = "a";
// c[0] == 'a'
// c[1] == '\0'
// c[2] == ?
// c[3] == ?
es als Teil initializer Behandlung würde Sinn machen, sei es char c[4] = "a"
genau wie char c[4] = {'a'}
macht verhalten, und es würde den nützlichen Nebeneffekt hat so dass Sie einen Zeichen-Array mit char d[N] = ""
prägnanten ganzen Null initialisieren, aber es ist mir gar nicht klar, dass das die Spezifikation erfordert.
Woot. Ich habe eine Frage zu SO gefunden, die Sinn macht. Dan, du hast meinen Tag gemacht. –