4 Stimmen

Beim Kopieren von Zeichenketten in C Platz für das abschließende Null-Zeichen zuweisen?

Const char* src = "hallo";

Aufruf von strlen(src); gibt Größe 5 zurück...

Sagen wir, ich mache das:

char* dest = new char[strlen(src)];
strcpy(dest, src);

Das sieht nicht so aus, als ob es funktionieren sollte, aber wenn ich alles ausgeben lasse, sieht es richtig aus. Es scheint, als würde ich keinen Platz für den Nullterminator am Ende reservieren... ist das richtig? Danke

1voto

Paradigm Punkte 141

Alternativ könnten Sie auch dest = strdup(src) verwenden, was genügend Speicher für die Zeichenkette + 1 für den Nullterminator (+1 für Julianos Antwort) bereitstellen würde.

1voto

Norman Ramsey Punkte 193087

Aus diesem Grund sollten Sie immer, immer, immer valgrind bei jedem C-Programm, das zu funktionieren scheint.

1voto

BobbyShaftoe Punkte 27949

Ja, jeder hat den wichtigsten Punkt abgedeckt; Sie sind nicht garantiert zu scheitern. Tatsache ist, dass der Nullterminator in der Regel 0 ist, und 0 ist ein ziemlich häufiger Wert, der an einer bestimmten Speicheradresse sitzt. Es funktioniert also ganz zufällig. Man könnte das testen, indem man einen Speicherbereich nimmt, einen Haufen Müll hineinschreibt und dann den String dorthin schreibt und versucht, damit zu arbeiten.

Wie auch immer, das Hauptproblem, das ich hier sehe, ist, dass Sie über C sprechen, aber Sie haben diese Codezeile:

char* dest = new char[strlen(src)];

Dies lässt sich mit keinem Standard-C-Compiler kompilieren. Es gibt keine new Schlüsselwort in C. Das ist C++. In C würden Sie eine der Speicherzuweisungsfunktionen verwenden, normalerweise malloc . Ich weiß, das erscheint pingelig, aber das ist es nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X