Wie wird die Größe eines zugewiesenen C-Puffers bestimmt?

8

Ich habe einen Puffer und möchte einen Test machen, um zu sehen, ob der Puffer genügend Kapazität hat. Finde die Anzahl der Elemente, die ich zum Puffer hinzufügen kann.

%Vor%

Machen Sie ein

%Vor%

gibt nicht 10, irgendwelche Ideen, wie ich das erreichen kann?

    
godzilla 17.05.2012, 16:28
quelle

6 Antworten

4

buffer ist nur ein Zeiger ohne Größeninformation. Allerdings wird die malloc () - Routine die Größe der Zuweisung halten, die Sie gemacht haben, wenn Sie sie freigeben (), wird der richtige Speicherplatz frei. Wenn Sie also nicht in der malloc () -Funktionalität tauchen möchten, empfehle ich Ihnen, die Größe der Zuweisung selbst zu speichern. (Für eine mögliche Implementierung, siehe das Beispiel in der anderen API-Antwort).

    
Evert 17.05.2012, 16:37
quelle
19

Für GNU glibc:

%Vor%

BESCHREIBUNG

  

Die Funktion malloc_usable_size () gibt die Anzahl der verwendbaren Bytes in dem Block zurück, auf den ptr verweist, einen Zeiger auf einen Speicherblock, der von malloc (3) oder einer verwandten Funktion zugewiesen wurde.

    
Vitaly 11.07.2013 19:34
quelle
12

Sie können einen solchen Test nicht machen. Es liegt in Ihrer eigenen Verantwortung, sich daran zu erinnern, wie viel Speicher Sie zugewiesen haben. Wenn der Puffer Ihnen von jemand anderem gegeben wird, fordern Sie, dass sie auch die Größeninformation weitergeben, und machen Sie es in ihrer Verantwortung, den richtigen Wert zu übergeben oder das Programm zum Erliegen zu bringen.

    
Kerrek SB 17.05.2012 16:30
quelle
6

Da buffer ein Zeiger (kein Array) ist, gibt der Operator sizeof die Größe eines Zeigers und nicht die Größe des Puffers zurück, auf den er zeigt. Es gibt keine Standardmethode, um diese Größe zu bestimmen, also müssen Sie die Buchhaltung selbst durchführen (z. B. daran erinnern, wie viel Sie zugewiesen haben.)

Übrigens, es ist das gleiche für

%Vor%

Interessanterweise

%Vor%

ist 14. Können Sie raten warum?

    
Jens 17.05.2012 16:33
quelle
0
%Vor%

Benutze die API und nicht malloc / free und du kannst nichts falsch machen.

    
user82238 17.05.2012 16:37
quelle
0

sizeof wird verwendet, um die Größe für tatsächliche Objekte, nicht Zeiger für Objekte im Speicher zu berechnen. Es gibt die Größe von Strukturen oder Primitiven zurück. Ich meine, es wird funktionieren, aber Sie erhalten die Größe des Zeigers, nicht die Struktur, auf die er zeigt. Um die Länge eines Arrays zu erhalten, benutze:

  

strlen (Puffer)

    
SpaceBear 17.05.2012 16:48
quelle

Tags und Links