Wieso?

… geht des net?

#include 

void g(char x[], int a, int b)
{ char c=x[b];
 for(int i=b; i\>a; i--)
 {x[i]=x[i-1];} // 
dies is aus ner alten übungsaufgabe, die ich mache, also sollt se ja tun! (oder ich schreib bei b) was wird ausgebebn -\> nix, geht nich ^^)
mein compiler bringt mir 'access violation' und zwar an der gekennzeichneten stelle! ich find des irgendwie korrekt... was is da faul?

Hallo,

Ich muß gestehen, ich kann dir leider auch nicht genau erklären was das schief läuft aber bei mir kommt der Fehler erstens nur im Debug-Modus (VC++) und zweitens auch dann nicht, wenn ich statt…

char *x = „BEISPIELTEXT“;

char x[] = „BEISPIELTEXT“;

…einsetze.

Gruß Tobias

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

Ich muß gestehen, ich kann dir leider auch nicht genau
erklären was das schief läuft aber bei mir kommt der Fehler
erstens nur im Debug-Modus (VC++) und zweitens auch dann
nicht, wenn ich statt…

char *x = „BEISPIELTEXT“;

char x[] = „BEISPIELTEXT“;

…einsetze.

Das sind ja auch zwei völlig unterschiedliche Dinge. Wenn du den ersten Ausdruck durch einen C++ Compiler schiebst, solltest es zumindest eine Warning geben. Genaugenommen muß man den ersten Ausdruck wie folgt schreiben:

const char *x = „BEISPIELTEXT“;

Hier wird nur ein Zeiger angelegt, der auf eine Zeichenkette verweist. Die Zeichenkette ist readonly und darf potentiell in einem readonly Speicher (Code-Segement!?) liegen. Der Schreibzugriff auf x[0]=…; ist undefiniert und vermutlich der Auslöser für die Access-Violation.

char x[] = „BEISPIELTEXT“;

Dieser Ausdruck hingegen legt ein Feld an, welches mit den Werten initialisiert wird. Ein sizeof(x) liefert die strlen(„BEISPIELTEXT“)+1 zurück. Im ersten Fall ist sizeof(x) jedoch gleich sizeof(char*) und somit völlig unabhängig vom Inhalt.

Gruß Markus

Mir ist das vollkommen klar du hast einen Zeiger auf char um in ihn was zu schreiben musst du erst eine instanz erzeugen. z.B. mit new char
würde so dann aussehen

char *x = new char;
x = „BEISPIELTEXT“;

mfg intery.de

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Mir ist das vollkommen klar du hast einen Zeiger auf char um
in ihn was zu schreiben musst du erst eine instanz erzeugen.
z.B. mit new char
würde so dann aussehen

char *x = new char;

Fordere Speicher an und lasse x auf den Speicher verweisen.

x = „BEISPIELTEXT“;

Nun lasse x auf ein Zeichenkettenliteral verweisen und verliere den Zeiger auf den zuvor allokierten Speicher.

So erzeugst du bestenfalls ein memory leak. Und wenn du abschließend noch folgende Zeile ausführst, ist das weitere Programmverhalten undefiniert:

delete x;

Sicherlich meinstest du folgendes

*x = („Das ist ein Test“)[0];

Mehr pass aber nicht herein, da du nur ein einzelnes Zeichen angefordert hast.

Alternativ könnte man es auch wie folgt schrieben

char* x = 0;
x = strdup( „BEISPIEL“ );
free ( x );

Gruß Markus