Es ist sowieso eine schlechte Praxis, ein Zeichen-Array mit einem String-Literal zu initialisieren.
Der Autor dieses Kommentars rechtfertigt es nie wirklich, und ich finde die Aussage rätselhaft.
In C (und Sie dies als C markiert haben), das ist so ziemlich der einzige Weg zu initialisieren ein Array von char
mit einem String - Wert (Initialisierung unterscheidet sich von Zuordnung). Sie können entweder schreiben
char string[] = "october";
oder
char string[8] = "october";
oder
char string[MAX_MONTH_LENGTH] = "october";
Im ersten Fall wird die Größe des Arrays von der Größe des Initialisierers abgeleitet. String-Literale werden als Arrays char
mit einem abschließenden 0-Byte gespeichert , sodass die Größe des Arrays 8 ist ('o', 'c', 't', 'o', 'b', 'e', 'r', 0). In den zweiten beiden Fällen wird die Größe des Arrays als Teil der Deklaration angegeben (8 und MAX_MONTH_LENGTH
was auch immer das sein mag).
Was Sie nicht tun können, ist etwas zu schreiben
char string[];
string = "october";
oder
char string[8];
string = "october";
usw. Im ersten Fall, der die Erklärung string
ist unvollständig , da keine Array - Größe angegeben wurde und es gibt keine Initialisierer von der Größe zu nehmen. In beiden Fällen =
funktioniert das nicht, weil a) ein Array-Ausdruck, wie er string
möglicherweise nicht das Ziel einer Zuweisung ist, und b) der =
Operator ohnehin nicht definiert ist, den Inhalt eines Arrays in ein anderes zu kopieren.
Aus dem gleichen Grund können Sie nicht schreiben
char string[] = foo;
wo foo
ist ein anderes Array von char
. Diese Form der Initialisierung funktioniert nur mit String-Literalen.
BEARBEITEN
Ich sollte dies dahingehend ändern, dass Sie Arrays auch so initialisieren können, dass sie eine Zeichenfolge mit einem Initialisierer im Array-Stil enthalten, z
char string[] = {'o', 'c', 't', 'o', 'b', 'e', 'r', 0};
oder
char string[] = {111, 99, 116, 111, 98, 101, 114, 0}; // assumes ASCII
Aber es ist für die Augen einfacher, String-Literale zu verwenden.
BEARBEITEN 2
Um den Inhalt eines Arrays außerhalb einer Deklaration zuzuweisen , müssen Sie entweder strcpy/strncpy
(für Zeichenfolgen mit 0-Abschluss) oder memcpy
(für jeden anderen Array-Typ) Folgendes verwenden:
if (sizeof string > strlen("october"))
strcpy(string, "october");
oder
strncpy(string, "october", sizeof string); // only copies as many characters as will
// fit in the target buffer; 0 terminator
// may not be copied, but the buffer is
// uselessly completely zeroed if the
// string is shorter!