Wie Patrick schon geschrieben hat, legt die Zeile
eine Stringkonstante im Speicher an und zusätzlich die Zeigervariable
ptr, die so initalisiert wird, dass sie auf den Anfang der
Stringkonstante zeigt.
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:
1 | 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:
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:
1 | 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:
1 | sprintf(array, "%d", i);
|
bzw.
1 | 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.