Christian Seiler: (C / Linux) Richtig debuggen?

Beitrag lesen

Hallo Markus,

Wie kann ich mir das erklären....
char* string = "Test";

Eigentlich ist das strenggenommen falsch und hier liegt der Hund begraben. Denn "Test" ist ein String-Literal und hat eigentlich den Typ const char *, d.h. der Inhalt darf nicht modifiziert werden (const). Wenn du es an ein char * zuweist (und damit das const unter den Tisch kehrst, was Dir Dein Compiler mindestens mit einer Warnung quittieren sollte), dann hängt es von den Umständen ab, was genau passiert, wenn Du es doch versuchst zu modifizieren. In Deinem Fall halt Programmabsturz. Auf einigen Plattformen "funktioniert" es vielleicht auch, aber eben nicht ohne Nebeneffekte.

Seit wann ist es nicht erlaubt, Zeichen in einem Array zu überschreiben?

Weil Du _kein_ Array hast und auch kein Zeiger auf ein Array (wie Du es von malloc zurückbekommst) sondern einen Zeiger auf ein String-Literal (was laut Standard nicht modifiziert werden darf). Wenn Du ein Array deklarierst, dann funktioniert das auch:

char string[] = "Test";  
char *p = string;  
  
string[0] = 'f';  
p[1] = 'a';

Das legt Dir einen Array auf dem Stack an und den kannst Du später modifizieren - oder wie hier eben auch einen Zeiger auf das Array (bzw. wie in C halt üblich auf das erste Element des Arrays) erhalten und das dann über den Zeiger modifizieren.

Aber auch hier nochmal sicherheitshalber die Warnung: Der Array hier ist auf dem Stack angelegt und ist nicht mehr gültig, wenn die Funktion beendet wird. Das heißt: Du kannst einen Zeiger auf dieses Array nicht zurückgeben genausowenig wie Du einen Zeiger auf irgend eine andere lokale Variable zurückgeben kannst.

Alternativ kannst Du natürlich immer einen Zeiger auf ein Array auf dem Heap anfordern, den kannst Du dann auch zurückgeben:

char *string = (char *)malloc(sizeof("Test"));  
strcpy(string, "Test");  
char *p = string;  
  
string[0] = 'f';  
p[1] = 'a';

Viele Grüße,
Christian

--
Mein "Weblog" [RSS]
Using XSLT to create JSON output (Saxon-B 9.0 for Java)
»I don't believe you can call yourself a web developer until you've built an app that uses hyperlinks for deletion and have all your data deleted by a search bot.«
            -- Kommentar bei TDWTF