Char-Array-Deklaration und -Initialisierung in C

Lesezeit: 3 Minuten

Benutzer-Avatar
Alexey Pimenov

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!

Benutzer-Avatar
Frédéric Hamidi

Das liegt daran, dass Ihr erstes Code-Snippet nicht funktioniert Initialisierungaber Abtretung:

char myarray[4] = "abc";  // Initialization.

myarray = "abc";          // Assignment.

Und Arrays sind in C nicht direkt zuweisbar.

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


Benutzer-Avatar
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:

myarray[0] = 'a', myarray[1] = 'b', myarray[2] = 'c', myarray[3] = 0;

oder

char *ptr = myarray;
*ptr++ = 'a', *ptr++ = 'b', *ptr++ = 'c', *ptr = 0;

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

Benutzer-Avatar
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.

1282180cookie-checkChar-Array-Deklaration und -Initialisierung in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy