www.mikrocontroller.net

Forum: GCC Mehrdimensionale char-arrays

Autor: micha (Gast)
Datum: 12.07.2006 11:21

Hallo,

Folgendes geht ohne Angabe der Feldgröße:
char abc[]={"hallo"};
char def[]="hallo";
char *ghi={"hallo"};
char *jkl="hallo";

Folgende Beispiele gehen jedoch nicht:
char abc[][]={"compiler", "meckert"};
char def[2][]={"compiler", "meckert"};
char ghi[][9]={"compiler", "meckert"};

Wieso kann wenigstens für "char def" nicht automatisch die Feldgröße
(Stringlänge) ermittelt werden?

Das hier geht allerdings wieder ohne jegliche Feldgrößenangabe:
char *abc[] = {"so", "klappt", "es"};
printf(abc[2]);  //Ausgabe: "es"

Wieso? die subtilen Regeln von C sind mir nicht klar. Vielleicht kann
mich jemand erhellen... Danke
Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum: 12.07.2006 11:50

> Wieso kann wenigstens für "char def" nicht automatisch die
Feldgröße
> (Stringlänge) ermittelt werden?

ghi funktioniert anstandslos.  Die Stringlänge mehrerer Strings kann
er nicht automatisch ermitteln, aber die erste Felddimension kann
automatisch an Hand der Initializer ermittelt werden.  Aber das
mehrdimensionale Array ist für Zeichenketten ohnehin keine sehr
praktikable Lösung.

> Das hier geht allerdings wieder ohne jegliche Feldgrößenangabe:
> char *abc[] = {"so", "klappt", "es"};

Klar, jetzt bist du ja auch von einem mehrdimensionalen Array (of
char) übergegangen zu einem eindimensionalen (of pointer to char).
Das hat den zusätzlichen netten Effekt, dass du im Gegensatz zum
mehrdimensionalen Array nicht N-mal den Platz für den längsten String
allozierst, sondern N-mal den Platz für einen Zeiger, während die
Strings selbst ausschließlich den für ihre Darstellung notwendigen
Platz belegen.
Autor: micha (Gast)
Datum: 12.07.2006 12:04

char ghi[][9] als vermeintlich falsch ist mir glatt durchgegangen.
Vielen Dank für die Erklärung und den Hinweis auf Speicherbedarf! :-)
Autor: Karl heinz Buchegger (kbucheg)
Datum: 12.07.2006 12:22

> Wieso? die subtilen Regeln von C sind mir nicht klar. Vielleicht
> kann mich jemand erhellen... Danke

Im Grunde ist das Prinzip sehr simpel:
Wenn du ein mehrdimensionales Feld anlegst, dann muss
der Compiler dass irgendwie im Speicher unterbringen.
Er macht das so, dass er die einzelnen Elemente der
2-ten Dimension einfach aneinanderhängt.

char Test[2][3];

  Test
  +---+---+---+---+---+---+
  |   |   |   |   |   |   |
  +---+---+---+---+---+---+
    0   1   2   0   1   2

   |          |          |
     das hier    und hier
   ist Test[0]    Test[1]

man sagt auch: "der letzte Index läuft am schnellsten"
Die Elemente [0][0], [0][1], [0][2] liegen also direkt
hintereinander, gefolgt von [1][0], [1][1], [1][2]
usw.

Wenn du daher auf ein Element [a][b] zugreifst, muss
der Compiler ausgehend von der Startadresse des Arrays
rechnen:

    Adresse von [a][b] = Startadresse +
                         a * Dimensionierung der 2.ten Dimension +
                         b

Um also die Adresse berechnen zu können, muss der Compiler wissen
wie gross den die 2. te Dimension tatsächlich ist.
Bei
  char Test[2][3]
wäre das die 3.

Nun hätte man natürlich für char-Arrays als Sonderfall
zulassen können, dass der Compiler die Abzählerei macht.
Schliesslich ist alles dazu Notwendige in der Initialisierung
enthalten. Ich denke aber man wollte sich einfach keinen
Sonderfall einhandeln.

Übrigens: Bei
  char *abc[] = {"so", "klappt", "es"};

wird etwas völlig anderes im Speicher aufgebaut.
Das sieht dann so aus


    abc
   +-----+        +---+---+----+
   |  o---------->| s | o | \0 |
   +-----+        +---+---+----+   +---+---+---+---+---+---+----+
   |  o--------------------------->| k | l | a | p | p | t | \0 |
   +-----+                         +---+---+---+---+---+---+----+
   |  o-----------+
   +-----+        |
                  |    +---+---+----+
                  +--->| e | s | \0 |
                       +---+---+----+

Die einzelnen Strings liegen also irgendwo im Speicher und
werden nur durch das Pointer-Array zusammengehalten.
Autor: Simon K. (simon) Benutzerseite
Datum: 12.07.2006 15:54

Gut erklärt Karl Heinz, gefällt mir :-)
Autor: Rolf Magnus (Gast)
Datum: 12.07.2006 19:16

Dafür ist er bekannt.
Autor: Paul Hamacher (powl)
Datum: 15.05.2008 10:12

Der Thread ist zwar schon alt aber Karls Erklärung hat mich grad auch
begeistert, besonders die netten ASCII Zeichnungen^^ (hast du die per
Hand eingetippt? xD)

lg PoWl
Autor: emacs (Gast)
Datum: 15.05.2008 14:31

In nem emacs mit Mausunterstützung kann man die malen :D

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel





Hinweis: der Originalbeitrag ist mehr als 6 Monate alt.

webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net