Zuweisung von Speicher zur char * C-Sprache

7

Ist es die richtige Art, Speicher einem Char * zuzuordnen?

%Vor%     
boom 04.06.2010, 05:31
quelle

7 Antworten

14

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%     
Claudiu 04.06.2010, 05:36
quelle
9

Beachten Sie Folgendes:

  1. Strings sind nullterminiert (\ 0), und strlen () zählt sie nicht;
  2. Per Definition ist sizeof (char) 1 (Byte), also nicht erforderlich;
  3. Wenn Sie einen C (nicht C ++) Compiler verwenden, müssen Sie ihn nicht in char * ;
  4. umwandeln

Das wäre also:

%Vor%

Wenn Sie den Inhalt von inSides noch duplizieren möchten, können Sie strdup , z. B.:

verwenden %Vor%     
jweyrich 04.06.2010 05:51
quelle
3

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:

%Vor%

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.

    
R Samuel Klatchko 04.06.2010 05:51
quelle
1

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.

    
Vagrant 04.06.2010 05:39
quelle
1

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:

%Vor%     
Jerry Coffin 04.06.2010 05:49
quelle
0

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

%Vor%

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.

    
AnT 04.06.2010 06:14
quelle
0

Die korrekte Art der Zuordnung von dynamischem Speicher zu tempSides ist wie folgt:

%Vor%

char* speichert eine Zeichenkette, ähnlich wie char[] . Zeichenfolgen sind null (null) beendet. Daher sollte ein zusätzliches Byte für 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.

%Vor%

Wenn der Speicher freigegeben ist, muss %code% zugewiesen werden, um zu verhindern, dass er ein ungeordneter Zeiger ist.

%Vor%     
pkthapa 16.11.2016 04:40
quelle

Tags und Links