www.mikrocontroller.net

Forum: Compiler & IDEs Pointer Verständnis Problem


Autor: ernst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe da Verständnis Probleme mit C Grundlagen (hoffentlich gehört 
das hier überhaupt hin).

nachdem ich einen Pointer deklariere, z.B.
char *ptr;

dann die Adresse der Variable a übergebe
char a = 55;
ptr = &a;

und jetzt über den Pointer den Inhalt von a an die Variable b kopieren
char b;
b = *ptr;

Dann sollte ja jetzt b=55 sein.

So weit, so gut.
ptr "trägt" also die Speicheradresse von der Variable a.

Jetzt habe ich in einem Programm gesehen, dass so etwas gemacht wurde:
char *ptr="0123456";

Die Pointeradresse wurde quasi als String Variable genutzt.

zur Ausgabe wurde dann eine Variable i als String gewandelt und in den 
Pointer geschrieben.
unsignet char i = 555;
itoa(i,ptr,10);
...

Kann mir jemand den Zusammenhang erklären? Mit den oben genannte 
Erklärungen zu den Grundlagen ist mir die eben erwähnte Vorgehensweise 
nicht klar.


Danke
ernst

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ernst,

der Compiler legt den String automatisch in der Stringtabelle des 
fertigen Programms ab. Dieser String bekommt dann irgendeinen mehr oder 
weniger kryptischen Namen. In ptr wird tatsächlich nur die Adresse 
dieses automatisch
angelegten Strings abgelegt.
Jeden Formatstring der in einem printf o.ä. Aufruf verwendet wird, legt 
der Compiler so automatisch an.

Gruß
Patrick

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie Patrick schon geschrieben hat, legt die Zeile
char *ptr = "0123456";

eine Stringkonstante im Speicher an und zusätzlich die Zeigervariable
ptr, die so initalisiert wird, dass sie auf den Anfang der
Stringkonstante zeigt.
itoa(i, ptr, 10);

Das ist ein Fehler. Da es sich bei dem String, worauf ptr zeigt, um
eine Konstante handelt, darf er nicht beschrieben werden. Je nach dem,
wie auf dem Zielsystem der Speicher verwaltet wird, kann diese Anweisung
funktionieren, einen Speicherzugriffsfehler auslösen oder auch gar
nichts tun. Besser:
char array[] = "0123456";

Im Gegensatz zu oben wird nun ein beschreibbares char-Array angelegt,
das groß genug ist, um den String "0123456" aufzunehmen. Die
Array-Elemente können nun nach Belieben verändert werden. Eine
zusätzliche Zeigervariable wird nicht angelegt, was etwas Speicher
spart. array kann aber ähnlich wie ein char-Zeiger verwendet werden,
also:
itoa(i, array, 10);

Ganz schön ist diese Lösung aber immer noch nicht. Schreibst du mit
itoa eine Zahl in das Array, die mehr als 7 Stellen hat, wird das
Array überlaufen. Besser ist es, das Array explizit zu dimensionieren,
und zwar so groß, dass die größte auftretende Zahl einschließlich einem
eventuellen Vorzeichen und der String-Ende-Null darin Platz hat, also
bspw. so:
char array[11] = "0123456";

Und noch etwas: itoa ist keine Funktion der C-Standardbibliothek und
sollte deswegen vermieden werden. Statt dessen sollte sprintf oder
noch besser snprintf verwendet werden, um numerische Werte in ihre
Zeichendarstellung umzurechnen:
sprintf(array, "%d", i);

bzw.
snprintf(array, sizeof array, "%d", i);

Der Unterschied zwischen sprintf und snprintf liegt darin, dass
letztere Array-Überläufe vermeidet, indem sie die Größe des übergebenen
Arrays berücksichtigt.

Autor: ernst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ yalu:

Vielen Dank für deine ausführliche Antwort!

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.