Wenn Sie eine "Zeichenfolge" in Ihren Quellcode schreiben, wird diese direkt in die ausführbare Datei geschrieben, da dieser Wert beim Kompilieren bekannt sein muss (es stehen Tools zur Verfügung, mit denen Sie Software auseinander ziehen und alle darin enthaltenen Nur-Text-Zeichenfolgen finden können). Wenn Sie schreiben char *a = "This is a string"
, befindet sich der Speicherort von "Dies ist eine Zeichenfolge" in der ausführbaren Datei, und der Speicherort, auf den a
verweist, befindet sich in der ausführbaren Datei. Die Daten im ausführbaren Image sind schreibgeschützt.
Was Sie tun müssen (wie die anderen Antworten gezeigt haben), ist, diesen Speicher an einem Ort zu erstellen, der nicht schreibgeschützt ist - auf dem Heap oder im Stapelrahmen. Wenn Sie ein lokales Array deklarieren, wird für jedes Element dieses Arrays Speicherplatz auf dem Stapel erstellt, und das Zeichenfolgenliteral (das in der ausführbaren Datei gespeichert ist) wird in diesen Speicherplatz im Stapel kopiert.
char a[] = "This is a string";
Sie können diese Daten auch manuell kopieren, indem Sie Speicher auf dem Heap zuweisen und dann strcpy()
ein Zeichenfolgenliteral in diesen Bereich kopieren.
char *a = malloc(256);
strcpy(a, "This is a string");
Wenn Sie Speicherplatz zuweisen, malloc()
denken Sie daran, den Anruf zu tätigen, free()
wenn Sie damit fertig sind (lesen Sie: Speicherverlust).
Grundsätzlich müssen Sie nachverfolgen, wo sich Ihre Daten befinden. Jedes Mal , wenn Sie eine Zeichenfolge in Ihrer Quelle zu schreiben, dass Zeichenfolge nur gelesen wird (sonst würden Sie möglicherweise das Verhalten der ausführbaren Datei zu ändern werden - sich vorstellen , wenn Sie geschrieben char *a = "hello";
und dann geändert , a[0]
um 'c'
dann woanders geschrieben. printf("hello");
Wenn Sie durften das erste ändern. Zeichen von "hello"
, und Ihr Compiler hat es nur einmal gespeichert (es sollte), dann printf("hello");
würde ausgegeben cello
!)