newbie Fragen über malloc und sizeof

7

Kann mir jemand erklären, warum mein Aufruf von malloc mit einer String-Größe von 6 eine Größe von 4 Bytes zurückgibt? In der Tat, jedes Integer-Argument, das ich malloc gebe, bekomme ich eine Größe von 4. Als nächstes versuche ich zwei Strings zu kopieren. Warum ist meine Ausgabe der kopierten Zeichenfolge (NULL)? Folgendes ist mein Code:

%Vor%     
John 07.10.2009, 19:00
quelle

8 Antworten

15

sizeof(str) gibt die Größe eines Zeigers vom Typ char* zurück. Was Sie tun sollten, ist malloc die Größe der Zeichenfolge selbst:

%Vor%

Auch diese Zeilen:

%Vor%

Kann in C einfach wie folgt umgeschrieben werden:

%Vor%     
AraK 07.10.2009, 19:01
quelle
4

Zuerst sollten Sie verstehen, dass sizeof (xxx) Dabei ist xxx ein beliebiger linker Wertausdruck (eine Variable) ist immer äquivalent zu do sizeof ( Typ von xxx) ). Also, was Ihre sizeof (str) wirklich macht, gibt die Größe eines char * zurück, also die Größe eines anderen Zeigers. Bei einer 32-Bit-Architektur erhalten Sie 4, bei einer 64-Bit-Architektur 8, usw.

Also, wie andere auch erklärt haben, müssen Sie wissen, die Länge der Zeichenfolge, die Sie zuordnen möchten, und fügen Sie dann 1 zum Speichern der Terminal \ 0, C implizit verwenden, um am Ende der Zeichenfolgen setzen.

Aber um zu tun, was Sie wollen (kopieren Sie eine Zeichenkette und ordnen Sie den notwendigen Platz zu) ist es einfacher und effizienter strdup zu verwenden, was genau das tut: ein malloc und eine strcopy .

Vergessen Sie auch nicht, Speicherplatz freizugeben, den Sie selbst zugewiesen haben (mit malloc, calloc, strdup oder einer anderen Zuweisungsfunktion). In C wird es nicht verschwinden, wenn die zugewiesene Variable den Gültigkeitsbereich verlässt. Es bleibt bis zum Ende des Programms bestehen. Das nennen Sie ein Speicherleck.

%Vor%

Ein letzter Punkt: Ich habe die Nachricht in Bytes geändert, die mindestens zugewiesen wurden , weil Sie die zugewiesene Größe beim Aufruf von malloc nicht wirklich kennen. Es weist ziemlich oft etwas mehr Platz zu als Sie gefragt haben. Ein Grund ist, dass in vielen Speichermanagern freie Blöcke unter Verwendung irgendeiner versteckten Datenstruktur miteinander verbunden sind und jeder zugewiesene Block mindestens eine solche Struktur enthalten kann, ein anderer ist, dass zugewiesene Blöcke immer so ausgerichtet sind, dass sie mit jedem Typ kompatibel sind Ausrichtung.

Ich hoffe, es wird dir helfen, C etwas besser zu verstehen.

    
kriss 07.10.2009 20:13
quelle
3

Sie erhalten die Größe des Str Zeigers (4 Bytes), nicht was es zeigt?

    
Dean J 07.10.2009 19:01
quelle
2

sizeof(str) gibt den Speicherplatz zurück, der zum Speichern des Zeigers in der Zeichenfolge erforderlich ist, nicht die Zeichenfolge selbst. Sie können die Größe der Zeichenfolge beispielsweise mit strlen(str) anzeigen.

Dann beeinflussen Sie Ihren copy -Zeiger auf eine ganze Zahl mit dem Wert 0 (das Zeichen 'copy = NULL' ). Es ist das gleiche wie %code% , was die printf () -Funktion Ihnen zeigt.

    
RedGlyph 07.10.2009 19:04
quelle
1

Um Ihre zweiten Fragen zu lösen, haben Sie durch Ausführen der Anweisung copy++ den Wert von copy (dh die Adresse im Speicher, die ein char -Array enthält) geändert, so dass Sie es ausdrucken können Es zeigt auf das Ende des Arrays und nicht auf den Anfang (der von malloc() zurückgegebene Wert). Sie benötigen eine zusätzliche Variable, um die Zeichenfolge und zu aktualisieren, damit Sie auf den Anfang der Zeichenfolge zugreifen können:

Bearbeiten , um malloc/sizeof issue zu reparieren - danke CL.

%Vor%     
mob 07.10.2009 19:09
quelle
1

sizeof () gibt die Größe des tatsächlichen Typs der Variablen zurück. Wenn Sie Ihren Typ als char * definieren, wird die Größe eines Zeigers zurückgegeben.

Aber wenn Sie Ihre Variable zu einem Array gemacht haben, würde sizeof die Größe des Arrays selbst zurückgeben, was tun würde, was Sie tun wollen:

%Vor%     
R Samuel Klatchko 07.10.2009 19:45
quelle
1
  • sizeof () gibt die Größe des Zeigers und nicht die Menge der zugewiesenen Bytes zurück. Sie müssen die zugewiesenen Bytes nicht zählen, sondern nur prüfen, ob der zurückgegebene Zeiger nicht NULL ist.
  • Die Zeile copy = 'NULL' ; setzt den Zeiger zurück und macht %code% .
eyalm 07.10.2009 19:47
quelle
0

Sie können verwenden:

size_t malloc_userable_size (void * ptr);

anstelle von: sizeof

Aber es gibt die tatsächliche Größe des zugewiesenen Speicherblocks zurück! Nicht die Größe, die du an malloc weitergegeben hast!

    
Informate.it 17.01.2014 11:51
quelle

Tags und Links