2009-10-15 10 views
5

Ich habe versucht, den folgenden Code ein, um zu sehen, wie Größe der Daten eines Zeigers zu erhalten:Erste die Größe der Daten eines Pointer

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(){ 
    char *test_char_ptr = "This is just a test"; 
    int *test_int_ptr = (int *) malloc(16*sizeof(int)); 
    for(int i = 0; i<16; i++){ 
    test_int_ptr[i] = i; 
    } 
    printf("%s\n",test_char_ptr); 
    printf("Test char 1: %d\n", (int)sizeof test_char_ptr); 
    printf("Test char 2:%d\n", (int)sizeof *test_char_ptr); 
    printf("Test char 3: %d\n", (int)((strlen(test_char_ptr)+1) * sizeof(char))); 
    printf("Test int 1:%d\n", (int)sizeof test_int_ptr); 
    printf("Test int 2:%d\n", (int)sizeof *test_int_ptr); 
    return EXIT_SUCCESS; 
} 

Und Code der Ausgang (auf 32-Bit-gcc 4.3) ist :

This is just a test 
Test char 1: 4 
Test char 2:1 
Test char 3: 20 
Test int 1:4 
Test int 2:4 

ich, dass sizeof dachte (* test_char_ptr) würde die * test_char_ptr die sizeof geben Sie mir die Daten innerhalb von. Aber stattdessen gab es mir 1, was meiner Meinung nach die Größe von Char anstelle der Daten ist. Das gleiche gilt für test_int_ptr. Lange Rede, kurzer Sinn, meine Frage ist, wie kann ich die Größe von Daten innerhalb eines Zeigers oder eines dynamisch zugewiesenen Speichers erreichen.

+0

Seit Ihrer Bearbeitung, um die strlen() Zeile zu ändern denke ich, dass die Ausgabe nicht mehr übereinstimmt. –

+0

Ok Ich habe den Ausgang aktualisiert. – systemsfault

+0

möglich duplicate of [Wie finde ich die sizeof (ein Zeiger, der auf ein Array zeigt)] (http://stackoverflow.com/questions/492384/how-to-find-the-sizeofa-pointer-pointing-to-an- Array) – outis

Antwort

13

Das ist nichts, was Sie in C tun können, ohne die Informationen selbst zu verwalten. Du hast die Arrays erstellt, also hast du ihre Größe an einem Punkt gekannt, du musst sie nur selbst verwalten. Sie könnten eine Datenstruktur erstellen, die Ihnen hilft, oder einfach nur die Array- und Größeninformationen ohne jegliche Datenstruktur sorgfältig pflegen.

Darüber hinaus verwendet Ihr Code strlen(), um die Größe der Zeichenfolge abzurufen - stellen Sie sicher, dass Sie nicht vergessen, dass die zurückgegebene Größe das abschließende Nullzeichen nicht enthält ('\0'); Die Speichergröße einer Zeichenfolgenkonstante ist strlen(string) + 1.

+0

Es war schnell und schmutzig Testcode: D. Es ist also nur ein Tippfehler. – systemsfault

+0

Sie sollten in der Lage sein, Ihren Beitrag zu bearbeiten und dann zu bereinigen; Ich werde meine Antwort entsprechend ändern, wenn das passiert. –

+0

Es muss nicht sein, dass er Speicher zugewiesen hat. Es gibt einige Funktionen, die zugewiesenen Speicher und andere Subsysteme zurückgeben, die sie freigeben/modifizieren. CreateDIBSection ist ein Beispiel. –

5

sizeof kennt nur die volle Größe des Arrays, wenn das zur Kompilierzeit statisch bekannt ist. Für einen Zeiger wird die Größe der Speicheradresse zurückgegeben, d. H. 4 bei 32-Bit, 8 bei 64-Bit.

Wenn Sie Zeiger verwenden, müssen Sie die Größe der Daten, auf die sie zeigen, kennen und verfolgen. Die Sprachimplementierung wird es nicht für Sie tun, wie es für Arrays wäre.

+0

Ich glaube, Sie haben meine Aussage falsch interpretiert, oder ich habe sie nicht deutlich angegeben. sizeof (* p) kann 1 sein, aber sizeof (p) ist dasselbe wie sizeof (void *) – asveikau

+0

@asveikau: Ich kann jetzt sehen, dass ich dich falsch interpretiert habe. Es tut uns leid. – sbi

3

Es gibt keinen Standard Weg, dies zu tun. Sie müssen die Länge des zugewiesenen Speichers in einer anderen Variablen belassen oder einen "Container" verwenden, der für Sie die Übersicht behält.

Einige Plattformen haben Funktionen zum Finden der Anzahl von Bytes in einer Zuweisung, z. Symbian als AllocSize(ptr) Funktion.

5

Der Zeiger verfolgt nicht die Anzahl der Objekte, die hinter der (ersten) zugewiesen sind, auf die er zeigt. Das ist, weil es nicht möglich ist: malloc() gibt nur die Adresse des ersten Elements zurück, sonst nichts.

Daher gibt es keine Möglichkeit, die Größe eines dynamisch zugewiesenen Arrays zu ermitteln. Sie müssen es für sich selbst behalten.

2

Ein Zeiger zeigt nur auf den Anfang der Daten. Es weiß nichts über die Größe der Daten.

Verwandte Themen