Ich war neugierig, warum dies in C nicht erlaubt ist:
char myarray[4];
myarray = "abc";
Und das ist erlaubt:
char myarray[4] = "abc";
Ich weiß, dass ich im ersten Fall verwenden sollte strcpy:
char myarray[4];
strcpy(myarray, "abc");
Aber warum ist Deklaration und spätere Initialisierung nicht erlaubt und Deklaration und gleichzeitige Initialisierung erlaubt? Bezieht es sich auf die Speicherzuordnung von C-Programmen?
Vielen Dank!
Frédéric Hamidi
Das liegt daran, dass Ihr erstes Code-Snippet nicht funktioniert Initialisierungaber Abtretung:
Der Name myarray tatsächlich in die Adresse seines ersten Elements aufgelöst (&myarray[0]), was keine ist Wertund kann daher nicht das Ziel einer Zuweisung sein.
&myarray[0] ist kein lvalue? Aber ich dachte, ein Lvalue sei nur ein Speicherort. Das Problem in diesem Fall ist myarray ist konstnicht dass es kein lvalue wäre.
– Großer McLargeHuge
10. Dezember 2015 um 21:39 Uhr
@Dave, ein lvalue ist ein “Speicherort”, und das ist der Grund &myarray[0] ist kein lvalue – es ist eine Adresse, nicht der Speicherort, auf den es zeigt.
– Frédéric Hamidi
11. Dezember 2015 um 7:38 Uhr
Ja, das ist eine Art Inkonsistenz in der Sprache.
Das “=” in myarray = "abc"; ist eine Zuweisung (was nicht funktioniert, da das Array im Grunde eine Art konstanter Zeiger ist), während in char myarray[4] = "abc"; es ist eine Initialisierung des Arrays. Es gibt keine Möglichkeit für “späte Initialisierung”.
Diese Regel sollten Sie sich einfach merken.
Da gibt es keine Widersprüchlichkeit. marray ist ein Array und kein Zeiger, das ist alles.
– Jens Gustedt
12. Februar 2011 um 13:38 Uhr
@Jens: Die Inkonsistenz besteht darin, dass die Initialisierung syntaktisch genauso bezeichnet wird wie die Zuweisung. Genau das hat zu dem Missverständnis geführt.
– Vlad
13. Februar 2011 um 11:18 Uhr
Diese Syntax gibt es nur als Abkürzung. ich denke, dass char myarray[4] = { "abc" }; macht vieles klarer und eindeutiger.
– Jens Gustedt
13. Februar 2011 um 13:02 Uhr
@Jens: Die Syntax, die Sie im letzten Kommentar erwähnen, unterscheidet sich von der, die OP bespricht. Diese Syntax wäre natürlich weniger zweideutig. Meiner Meinung nach sollte eine visuell unterschiedliche Initialisierung und Zuweisung ein guter Hinweis für die Entwickler sein, dass sie nicht gleich sind. Die Syntax könnte evtl char myarray[4]("abc"); oder sowas ähnliches.
– Vlad
13. Februar 2011 um 13:08 Uhr
Pierre
myarray = "abc";
…ist die Zuweisung eines Zeigers auf “abc” zum Zeiger myarray.
Dies füllt den myarray-Puffer NICHT mit “abc”.
Wenn Sie den myarray-Puffer manuell ohne strcpy() füllen möchten, können Sie Folgendes verwenden:
Ihre Frage bezieht sich auf den Unterschied zwischen einem Zeiger und einem Puffer (einem Array). Ich hoffe, Sie verstehen jetzt, wie C jede Art anspricht.
“…ist die Zuweisung eines Zeigers auf “abc” zum Zeiger myarray.” myarray ist ein Array, kein Zeiger.
– CB Bailey
12. Februar 2011 um 12:38 Uhr
Sie möchten keine Signaturen verwenden. Sie haben bereits eine unter der Antwort.
– YasirA
12. Februar 2011 um 12:39 Uhr
@Raynos: Sie sind sich sehr ähnlich, aber nicht gleich.
– Vlad
12. Februar 2011 um 12:45 Uhr
davep
Dies ist ein weiteres C-Beispiel dafür, wo dieselbe Syntax unterschiedliche Bedeutungen hat (an verschiedenen Stellen). Man könnte zwar argumentieren, dass die Syntax für diese beiden Fälle unterschiedlich sein sollte, aber es ist so, wie es ist. Die Idee ist, dass es nicht “nicht erlaubt” ist, sondern dass das Zweite etwas anderes bedeutet (es bedeutet “Zeigerzuweisung”).
Ich denke, das sind zwei wirklich unterschiedliche Fälle. Im ersten Fall wird Speicher zur Kompilierzeit zugewiesen und initialisiert. Im zweiten – zur Laufzeit.
12821800cookie-checkChar-Array-Deklaration und -Initialisierung in Cyes