Warum brauchen wir strdup ()?

8

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 *

verwenden

Ich 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?

    
letsc 02.11.2010, 16:31
quelle

5 Antworten

11

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.

    
JaredPar 02.11.2010, 16:36
quelle
4

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.

    
Ignacio Vazquez-Abrams 02.11.2010 16:35
quelle
2

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.

    
Puppy 02.11.2010 16:37
quelle
1

Das ist ein Problem in C. Obwohl Zeichenfolgenliterale char * sind, können Sie sie nicht ändern, daher sind sie effektiv const char* .

Wenn Sie gcc verwenden, können Sie mit -Wwrite-strings prüfen, ob Sie String-Literale korrekt verwenden.

    
Let_Me_Be 02.11.2010 16:37
quelle
0

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.

    
haylem 02.11.2010 16:51
quelle

Tags und Links