2010-02-14 13 views
11

Mögliche Duplizieren:
newbie questions about malloc and sizeofMit sizeof() auf malloc'd Speicher

Ich versuche, Strings in ein Programm zu lesen. Als ich bemerkte, dass die Saiten manchmal beschädigt wurden, habe ich versucht, den folgenden Code:

void *mallocated = malloc(100); 
printf("sizeof(mallocated) = %d\n", sizeof(mallocated)); 

Nach meinem Programm, war die Größe von mallocated8, obwohl ich 100 Byte für zugeordnet. Wenn ich versuche, eine Zeichenfolge länger als 8 Byte zu speichern, verschwindet daher alles nach dem 8. Byte manchmal. Warum passiert das und wie kann ich es verhindern?

+4

sizeof (mallocated) gibt Ihnen die Größe von void *, die 8 Bytes auf Ihrem 64-Bit-System ist. Wie weisen Sie dieser Variablen einen String zu, mit strcpy? – tur1ng

+0

Siehe: http://stackoverflow.com/questions/1533519/newbie-questions-about-malloc-and-sizeof – Shog9

+0

Ihre Schlussfolgerung ist auch falsch, alles nach dem 8. "Byte" geschrieben (nicht Bit) nicht zufällig verschwinden manchmal. – Blindy

Antwort

13

Da die Größe des "String" -Zeigers 8 Bytes ist. Hier sind einige Beispiele für die Verwendung von sizeof() mit ihrer entsprechenden "Größe". Der Begriff size_of() täuscht manchmal für Leute, die nicht daran gewöhnt sind, ihn zu benutzen. In Ihrem Fall ist die Größe des Zeigers 8 Bytes. Unten ist eine Darstellung auf einem typischen 32-Bit-System.

sizeof (char) = 1 
sizeof (double) = 8 
sizeof (float) = 4 
sizeof (int) = 4 
sizeof (long) = 4 
sizeof (long long) = 8 
sizeof (short) = 2 
sizeof (void *) = 4 

sizeof (clock_t) = 4 
sizeof (pid_t) = 4 
sizeof (size_t) = 4 
sizeof (ssize_t) = 4 
sizeof (time_t) = 4 

Source

Sie verlassen, wie Sie Ihre Zeichenfolge Bestimmung verschwindet (char-Array). Es wird wahrscheinlich an eine Funktion übergeben, die Sie die explizite Länge als Variable übergeben oder irgendwo verfolgen müssen. Die Verwendung von sizeof() sagt Ihnen das nicht.

Sehen Sie meine previous question darüber und Sie werden sogar meinen Mangel an anfänglichem Verständnis sehen.

+0

Danke für die Hilfe. Das Problem mit dem Programm war nicht ganz das, was ich dachte (war es jemals?), Aber Ihr Rat war sehr nützlich. –

7

In C89, sizeof Operator findet nur die Größe eines variable in Bytes zur Kompilierzeit (in diesem Fall ein Zeiger void von 8 Bytes). Es funktioniert so, wie Sie es von normalen Arrays erwarten, da ihre Größe zur Kompilierungszeit bekannt ist.

char arr[100]; // sizeof arr == 100 
char *p = arr; // sizeof p == 4 (or 8 on 64-bit architectures) 
char *p = malloc(100); // sizeof p == 4 (or 8). Still! 

die Größe des Heap-Speicher zugewiesen Um zu wissen, müssen Sie manuell es im Auge zu behalten, sizeof wird dir nicht helfen.

+1

Das stimmt nicht. In C99 gibt 'sizeof' die Größe eines Array variabler Länge zurück, das in vielen Fällen nur zur Laufzeit bestimmt werden kann. – dreamlax

+0

Danke, ich habe den C99-Fall von der Antwort ausgeschlossen, um die Dinge einfacher zu halten. –

7

sizeof gibt die Größe des Zeigers (void *) zurück, den Sie ihm gegeben haben, nicht die Größe des zugewiesenen Speichers. Sie müssten die Größe des Speichers in einer separaten Variablen speichern, wenn Sie sie später verwenden möchten.

3

Sie können nicht. Wie bereits erwähnt, können Sie die Größe der void * mallocated bekommen, aber das sagt Ihnen nicht viel.

Sie kann nicht erhalten die Größe der Malloed *mallocated. Das heißt, es gibt keinen Funktionsaufruf, um 100 zurückzugeben (in Ihrem Beispiel) - es sei denn, Sie schreiben Ihre eigenen Speicherverwaltungsroutinen.

Simplest ist es einfach irgendwo ... vielleicht zu erinnern ....

stuct { 
    void *data; 
    unsigned int size 
} myStructureWhichRemebersItsSize; 

myStructureWhichRemebersItsSize *someData; 
someData.data = malloc(100); // and check for NULL 
someData.size = 100; 
+1

"Sie können die Größe der Malloed nicht bekommen" ... Nicht wahr, es hängt von Ihren C-Bibliotheken ab. Unter MS CRT STDLIB können Sie einfach '_msize (* mallocated)' aufrufen, um die "100" zu erhalten, die das OP sucht. –

+0

+1 Danke für die Info. Ich benutze keine MS, also wusste ich das nicht. Ein nützliches Feature, das an mehr Orten gut zu sehen wäre. Hinter den Kulissen erzeugt der Compiler wahrscheinlich eine Struktur, wie ich sie beschrieben habe. – Mawg

0

void* der Typ einer Stelle im Speicher ist, wenn Sie nicht wissen, was es enthält. Es sollte vermieden werden.

char* ist der Typ eines Wertes, der auf eine Stelle im Speicher zeigt, die eine char enthält. Das Identifizieren eines Speicherorts dauert acht Bytes.

sizeof sagt Ihnen, wie viele Bytes ein bestimmter Typ dauert. Nicht wie viele mit malloc zugewiesen wurden, sondern wie viel Speicher Compiler den Typ sollte nehmen. Das Anwenden von sizeof auf Werte wird oft als schlechter Stil angesehen, und manchmal ruft ein anderer hier intelligentes Verhalten in C99 auf.

char[100] der Typ eines Werts, der 100 Zeichen enthält. char[100] a; ist eine Zeichenfolge von 100 char s auf dem Stapel.

char(*)[100] ist der Typ eines Zeigers auf einen Wert, der 100 Zeichen enthält. char(*b)[100]; macht b Punkt auf 100 Zeichen, möglicherweise auf dem Heap. Was Sie wahrscheinlich wollen, ist

char (*s)[100] = malloc(sizeof(char[100])); 
printf("%u byte pointer to %u bytes of size %u elements\n", 
    sizeof s, sizeof *s, sizeof **s);