Während ich an einer Aufgabe arbeitete, wurde mir klar, dass wir keine Aufgaben wie:
verwenden sollten %Vor%Programme, die solche Syntax verwenden, sind anfällig für Abstürze.
Ich habe es versucht und benutzt:
%Vor%Auch das obige funktioniert (obwohl die Ausgabe compiler- und standardspezifisch ist).
Stattdessen sollten wir strdup () versuchen oder const char *
verwendenIch habe versucht, andere ähnliche Fragen auf dem Blog zu lesen, konnte aber nicht das Konzept bekommen, WARUM DER OBEN CODE SOLLTE ARBEITEN.
Ist Speicher zugewiesen? Und welchen Unterschied macht const?
Lasst uns die Dinge ein bisschen klären. Sie brauchen nicht unbedingt strdup
. Es ist nur eine Funktion, die eine Kopie von char*
auf dem Heap reserviert. Dies kann auf viele verschiedene Arten geschehen, einschließlich mit Stack-basierten Puffern. Was Sie brauchen, ist das Ergebnis, eine veränderbare Kopie von char*
.
Der Grund dafür, dass der von Ihnen aufgeführte Code gefährlich ist, besteht darin, dass er eine wirklich konstante Zeichenkette in einem String-Literal in einen Slot übergibt, der eine veränderbare Zeichenkette erwartet. Dies ist im C-Standard leider erlaubt, ist aber inhärent gefährlich. Das Schreiben in eine konstante Zeichenfolge führt zu unerwarteten Ergebnissen und stürzt häufig ab. Die Funktion strdup
function behebt das Problem, weil sie eine veränderbare Kopie erstellt, die in einem Slot abgelegt wird und eine veränderbare Zeichenfolge erwartet.
String-Literale werden im Datensegment des Programms gespeichert. Wenn Sie ihre Zeiger manipulieren, wird das Zeichenfolgenliteral geändert, was im besten Fall zu seltsamen Ergebnissen führen kann. Verwenden Sie strdup()
, um sie stattdessen in den Heap- oder Stack-reservierten Bereich zu kopieren.
String-Literale können in Teilen des Speichers gespeichert werden, die keine Schreibrechte haben. Der Versuch, in sie zu schreiben, führt zu undefiniertem Verhalten. const bedeutet, dass der Compiler sicherstellt, dass der Zeiger nicht geschrieben wird, und garantiert, dass Sie auf diese Weise kein undefiniertes Verhalten aufrufen.
Lesen Sie meine Antwort zu (Array & amp; String) Differenz zwischen Java und C . Es enthält die Antwort auf Ihre Frage im Abschnitt über Strings.
Sie müssen verstehen, dass es einen Unterschied zwischen statischer und Speicherzuweisung gibt und dass Sie nicht auf dieselben Speicherbereiche zurückgreifen.
Tags und Links c