In dem obigen Code denke ich, dass der Speicher für das String-Literal in einem globalen Raum zugeordnet ist. In welchem Abschnitt geht es tatsächlich und wann? Geht der Compiler durch und weist ihn im Programmbereich zu ?? Auch wenn ich eine andere Zeichenfolge mit dem gleichen Zeichenfolgenliteral, d. H. (char *k = "here";
), initialisiere, wird es auf den gleichen Speicherort zeigen. Ich versuche zu denken, da ich diesen Ort nicht freigeben kann, stoße ich in irgendwelche Schwierigkeiten, wenn ich viele String-Initialisierungen in meinem Code habe. Ich denke, das Einzige, worüber ich mir Sorgen machen sollte, ist die Compilerausgabe, die zu groß ist, da in diesem Fall keine Laufzeitspeicherzuweisung vorhanden ist?Speicherzuordnung von String literal strcpy
Antwort
Die genaue Position hängt vom Objektdateiformat ab (PE vs. ELF vs. COFF) und allen Befehlszeilenoptionen (einige können Zeichenfolgenliterale in einem beschreibbaren Speichersegment speichern). ELF speichert es im Segment .rodata
, das, wie der Name sagt, schreibgeschützt ist.
mehrere Instanzen des gleichen Stringliteral kann Karte an den gleichen Ort, aber es ist nicht erforderlich AFAIK (Ich bin nicht bekannt, dass Compiler, mehrere Instanzen des gleichen wörtlichen, aber meine Erfahrung ist das nicht schafft breit).
Dinge, die sicher sind:
- Raum für Stringliterale wird beim Programmstart zugewiesen (in der Regel, wenn das Programm in den Speicher geladen wird), und gehalten, bis das Programm beendet;
- Der Versuch, den Inhalt eines Stringliteral Invokes zu ändern undefinierten Verhalten - Code kann segfault, oder es kann wie vorgesehen funktionieren, oder es kann die Festplatte formatieren, oder es kann die Zombie-Apokalypse auslösen.
Beachten Sie, dass der Code einen Fehler hat - man kann nie eine sinnvolle Adresse s
zuweisen, so dass die strcpy
im Wesentlichen versucht, die Zeichenfolge "here"
an einen zufälligen Ort zu schreiben, die wiederum nicht definiertes Verhalten ist. Sie haben vielleicht
s = "here";
schreiben wollte, die s
zu wörtlichen Punkt setzt. Wenn nicht, dann wird s
entweder ein Array groß genug sein, um die Zeichenfolge zu halten:
char s[sizeof "here"]; // sizeof evaluated at compile time
oder Sie werden dynamisch, dass der Raum zuweisen müssen:
char *s = malloc(strlen("here") + 1);
if (s)
strcpy(s, "here");
- 1. String Zeiger und strcpy
- 2. C strcpy Array von String-Zeigern
- 3. String Literal vs String Objekt
- 4. leerer String Literal
- 5. Resharper Split String Literal
- 6. String Literal Overloading
- 7. Wie ein String-Literal
- 8. Suche nach Literal String
- 9. Speicherzuordnung für c_str Funktion in String-Klasse
- 10. Swift Datum literal/Datum Initialisierung von String
- 11. Vorlage Argument Abzug von String Literal
- 12. Convert string [] Literal String-Typ wörtliche
- 13. String-Verkettung: + Operator mit String-Literal
- 14. Swift String über String Literal vs Initialisierer
- 15. String Literal Adresse über Übersetzungseinheiten
- 16. Richtig ein Java-String-Literal
- 17. Java JSON Parse Literal String
- 18. Literal-String-Operation in REXX
- 19. Place String Literal vor Variable
- 20. bash printf literal verbatim string
- 21. Mehrere aufeinanderfolgende strcpy(), Display enthält Bits von jedem nächsten strcpy()
- 22. OS: Speicherzuordnung
- 23. strcpy im Array von Strings
- 24. Speicherzuordnung Problem
- 25. Laufzeitfehler Speicherzuordnung
- 26. Verständnis Speicherzuordnung
- 27. strcpy() funktioniert nicht
- 28. Segmentierungsfehler beim Aufruf von strcpy
- 29. Typescript-Import von <variable> anstelle von Literal-String?
- 30. strcpy Crashes C Programm
Die wörtliche zugeordnet ist in '. Rodata'. Oder gar nicht zugewiesen, da es eine kurze Zeichenfolge ist und in Register passen kann. Aber Ihr Code ist sowieso ungültig. Da 's' nicht zugewiesen ist. –