Ich bin nicht sicher, was nach der Initialisierung auf folgende Weise im char-Array enthalten sein wird.
1. char buf[10] = "";
2. char buf[10] = " ";
3.char buf[10] = "a";
Für Fall 2 denke ich, buf[0]
sollte sein ' '
, buf[1]
sollte sein '\0'
und von buf[2]
bis buf[9]
wird zufälliger Inhalt sein. Für Fall 3, denke ich buf[0]
soll sein 'a'
, buf[1]
sollte ‚\ 0‘ sein, und von buf[2]
zu buf[9]
werden gelegentlichen zufrieden sein.
Ist das korrekt?
Und für den Fall 1, was wird in der sein buf
? buf[0] == '\0'
und von buf[1]
bis buf[9]
wird zufälliger Inhalt sein?
char buf[10]; buf = "a";
nicht nicht kompilieren. - Bitte versuchen Sie es zuerst und kopieren Sie dann Ihren tatsächlichen Code in die Frage. Das spart Ihnen und allen Lesern Ihrer Frage viel Arbeit.Antworten:
So initialisieren Sie ein Array nicht, sondern für:
Die erste Erklärung:
ist äquivalent zu
Die zweite Erklärung:
ist äquivalent zu
Die dritte Erklärung:
ist äquivalent zu
Wie Sie sehen können, kein zufälliger Inhalt: Wenn weniger Initialisierer vorhanden sind, wird der Rest des Arrays mit initialisiert
0
. Dies ist auch dann der Fall, wenn das Array innerhalb einer Funktion deklariert ist.quelle
char
.0
und'\0
haben den gleichen Wert.char buff[3] = "abcdefghijkl";
ist ungültig.char p3[5] = "String";
ist auch ungültig.char p[6] = "String";
ist gültig und ist das gleiche wiechar p[6] = {'S', 't', 'r', 'i', 'n', 'g'};
.Bearbeiten: OP (oder ein Editor) hat einige der einfachen Anführungszeichen in der ursprünglichen Frage stillschweigend in doppelte Anführungszeichen geändert, nachdem ich diese Antwort gegeben hatte.
Ihr Code führt zu Compilerfehlern. Ihr erstes Codefragment:
ist doppelt illegal. Erstens gibt es in C kein leeres
char
. Sie können doppelte Anführungszeichen verwenden, um eine leere Zeichenfolge zu kennzeichnen, wie bei:Das gibt Ihnen einen Zeiger auf einen
NUL
String, dh eine Einzel Zeichenkette nur mit demNUL
Charakter in ihm. Sie können jedoch keine einfachen Anführungszeichen verwenden, in denen sich nichts befindet - das ist undefiniert. Wenn Sie denNUL
Charakter bestimmen müssen, müssen Sie ihn angeben:Der Backslash ist notwendig, um vom Charakter zu unterscheiden
'0'
.erreicht das gleiche, aber das erstere ist ein bisschen weniger zweideutig zu lesen, denke ich.
Zweitens können Sie Arrays nicht initialisieren, nachdem sie definiert wurden.
deklariert und definiert das Array. Die Array-ID
buf
ist jetzt eine Adresse im Speicher, und Sie könnenbuf
durch Zuweisung nicht ändern, wo Punkte liegen. Soist illegal. Ihre zweiten und dritten Codefragmente sind aus diesem Grund illegal.
Um ein Array zu initialisieren, müssen Sie dies zum Zeitpunkt der Definition tun:
Sie erhalten ein Array mit 10 Zeichen, wobei das erste Zeichen das Leerzeichen
'\040'
und der Rest das ZeichenNUL
ist'\0'
. Wenn ein Array mit einem Initialisierer deklariert und definiert wird, werden die Array-Elemente (falls vorhanden), die über die Elemente mit den angegebenen Anfangswerten hinausgehen, automatisch aufgefüllt0
. Es wird keinen "zufälligen Inhalt" geben.Wenn Sie das Array deklarieren und definieren, es aber nicht wie folgt initialisieren:
Sie werden zufälligen Inhalt in allen Elementen haben.
quelle
Diese sind gleichwertig
Diese sind gleichwertig
Diese sind gleichwertig
quelle
Der relevante Teil der Initialisierung des C11-Standardentwurfs n1570 6.7.9 lautet:
und
Daher wird '\ 0' angehängt, wenn genügend Speicherplatz vorhanden ist , und die verbleibenden Zeichen werden mit dem Wert
static char c;
initialisiert, den a innerhalb einer Funktion initialisieren würde.Schließlich,
Da
char
es sich um einen arithmetischen Typ handelt, wird garantiert, dass der Rest des Arrays auch mit Nullen initialisiert wird.quelle
Interessanterweise ist es möglich, Arrays jederzeit im Programm auf irgendeine Weise zu initialisieren, vorausgesetzt, sie sind Mitglieder eines
struct
oderunion
.Beispielprogramm:
quelle
Ich bin mir nicht sicher, aber ich initialisiere ein Array normalerweise mit "". In diesem Fall muss ich mir keine Sorgen um das Null-Ende der Zeichenfolge machen.
quelle
main()
(und Sie sollten auch verwendenvoid
, dhint main(void) { ... }
. C99 wurde von dieser Regel zu befreien, so dass dieser Code nicht für C99 kompilieren und später. Die andere Sache , hier zu beachten ist , dass beginnend mit C99, wenn Sie weglassenreturn
in main, es gibt eine automatischereturn 0;
Platzierung / Implikation vor dem}
Ende von at main. Sie verwenden die implizite int-Regel, die nur vor C99 funktioniert, aber Sie verwenden die implizite Regel, die nurreturn
mit C99 und höher funktioniert . Diese beiden sind offensichtlich widersprüchlich .