Verwenden von sizeof mit einem dynamisch zugewiesenen Array

8

gcc 4.4.1 c89

Ich habe das folgende Code-Snippet:

%Vor%

Die Größe von (Puffer) wird jedoch immer gedruckt 4. Ich weiß, dass ein Zeichen * nur 4 Byte ist. Allerdings habe ich den Speicher für 10kb reserviert. Sollte also nicht die Größe 10240 sein? Ich frage mich, denke ich gerade hier?

Vielen Dank für Anregungen,

    
ant2009 28.04.2010, 16:51
quelle

5 Antworten

14

Sie fragen nach der Größe eines char* , was tatsächlich 4 ist, nicht die Größe des Puffers. Der Operator sizeof kann die Größe eines dynamisch zugewiesenen Puffers nicht zurückgeben, sondern nur die Größe der statischen Typen und Strukturen, die zur Kompilierungszeit bekannt sind.

    
Péter Török 28.04.2010, 16:54
quelle
9

sizeof funktioniert nicht bei dynamischen Zuordnungen (mit einigen Ausnahmen in C99). Ihre Verwendung von sizeof hier gibt Ihnen nur die Größe des Zeigers. Dieser Code gibt Ihnen das gewünschte Ergebnis:

%Vor%

Wenn malloc() erfolgreich ist, ist der angezeigte Speicher mindestens so groß, wie Sie gefragt haben. Es gibt also keinen Grund, sich um die tatsächliche Größe zu kümmern, die zugewiesen wurde.

Außerdem haben Sie 10 kB zugewiesen, nicht 1 kB.

    
Carl Norum 28.04.2010 16:53
quelle
3

Es liegt an Ihnen, die Speichergröße zu verfolgen, wenn Sie sie benötigen. Der von malloc zurückgegebene Speicher ist nur ein Zeiger auf "nicht initialisierte" Daten. Der Operator sizeof arbeitet nur an der Variablen buffer .

    
Mark Wilkins 28.04.2010 16:54
quelle
3

Nein. buffer ist ein char * . Es ist ein Zeiger auf char data. Der Zeiger benötigt nur 4 Bytes (auf Ihrem System).

Es zeigt auf 10240 Bytes von Daten (das ist übrigens nicht 1 KB. Mehr wie 10 KB), aber der Zeiger weiß das nicht . Überlegen Sie:

%Vor%

Es ist der Hauptunterschied zwischen Arrays und Zeigern. Wenn dies nicht funktioniert, ändert sich sizeof p im obigen Code, was für eine Kompilierzeitkonstante nicht sinnvoll ist.

    
Chris Lutz 28.04.2010 16:56
quelle
2

Ersetzen Sie Ihre sizeof durch malloc_usable_size (die Manpage gibt an, dass dies nicht portierbar ist, daher möglicherweise nicht mit Ihrer bestimmten C-Implementierung verfügbar ist).

    
Anon 28.04.2010 16:56
quelle

Tags und Links