Fast. Zeichenfolgen sind NULL beendet, so dass Sie wahrscheinlich ein zusätzliches Byte zuordnen möchten, um das NULL-Byte zu speichern. Das heißt, obwohl sides
1 Zeichen lang ist, sind es wirklich 2 Bytes: { 5
, '%code%'
}.
So wäre es:
%Vor%und wenn du es kopieren willst:
%Vor%Beachten Sie Folgendes:
char *
; Das wäre also:
%Vor% Wenn Sie den Inhalt von inSides
noch duplizieren möchten, können Sie strdup
, z. B.:
Wie bereits erwähnt, haben Sie es versäumt, Platz für den abschließenden NUL-Charakter zuzuweisen. Aber ich wollte auch auf ein paar andere Dinge hinweisen, die Ihren Code prägnanter machen können.
Per Definition ist sizeof(char)
immer 1, daher können Sie Ihre Zuweisungszeile verkürzen auf:
Eine andere Sache ist, dass es so aussieht, als würden Sie die Zeichenfolge duplizieren. Es gibt eine eingebaute Funktion, die das für Sie erledigt:
%Vor%Damit wird die Länge ermittelt, die richtige Anzahl von Bytes zugewiesen und die Daten kopiert.
Es gibt ein Problem damit. tempSides wird auf einen nicht initialisierten Speicherblock der Größe 1 verweisen. Wenn Sie die Seitenzeichenfolge in tempSides kopieren möchten, müssen Sie eine Größe um ein Byte länger zuweisen, um den Nullabschluss für die Zeichenfolge zu speichern. Der von strlen () zurückgegebene Wert enthält nicht den Null-Terminator am Ende der Zeichenfolge.
Nein, nicht wirklich. Wie andere bereits bemerkt haben, müssen Sie Platz für den NUL-Terminator reservieren.
Darüber hinaus sollten Sie nicht im Allgemeinen die Rückgabe von malloc
umsetzen. Es kann einen Fehler enthalten, bei dem du #include
den richtigen Header vergessen hast. Multiplikation mit sizeof(char)
ist auch sinnlos, da die Standards (sowohl C als auch C ++) sizeof(char)
auf immer 1 festlegen.
Schließlich sollte jeder Aufruf von malloc
einen Test des Ergebnisses enthalten. Ich würde das Ganze in eine Funktion verpacken:
Die Multiplikation der Elementanzahl mit sizeof(char)
ist eine Frage der persönlichen Präferenz, da sizeof(char)
immer 1 ist. Wenn Sie dies jedoch aus Gründen der Konsistenz tun, verwenden Sie lieber den Empfänger-Zeigertyp, um die Elementgröße zu bestimmen explizit eingeben. Und wirf nicht das Ergebnis von malloc
Natürlich müssen Sie bei der Arbeit mit nullterminierten Strings daran denken, zusätzlichen Platz für das abschließende Nullzeichen zuzuweisen. Es gibt keine Möglichkeit zu sagen, ob es deine Absicht ist, tempSides
in diesem Fall zu einer nullterminierten Zeichenfolge zu machen, also kann ich nicht sagen, ob du sie brauchst.
Die korrekte Art der Zuordnung von dynamischem Speicher zu tempSides
ist wie folgt:
char*
speichert eine Zeichenkette, ähnlich wie char[]
. Zeichenfolgen sind null (
beendet. Daher sollte ein zusätzliches Byte für null
)free()
-Zeichenspeicher reserviert werden.
Der dynamisch zugewiesene Speicherblock muss mit NULL
freigegeben werden, nachdem die Verwendung beendet ist. Wenn nicht freigegeben, würde Speicherverlust auftreten.
Wenn der Speicher freigegeben ist, muss %code% zugewiesen werden, um zu verhindern, dass er ein ungeordneter Zeiger ist.
%Vor%Tags und Links c memory-management malloc