2017-06-12 3 views
4

Ich möchte die Größe eines zugewiesenen Puffers unter Verwendung von calloc in byte wissen. Durch die Prüfung im Anschluss an den in meiner Maschine:Ermitteln Sie die Größe des im Heap zugewiesenen Puffers

double *buf = (double *) calloc(5, sizeof(double)); 
printf("%zu \n", sizeof(buf)); 

Das Ergebnis war 8, selbst wenn ich nur ein Element ändern noch ich 8. Meine Fragen bekommen sind:

  1. Bedeutet es, dass kann ich nur vermehren 8 * 5, um die Puffergröße in Byte zu erhalten? (Ich dachte, sizeof wird 40 zurückgeben).
  2. Wie kann man ein Makro machen, das die Größe des Puffers in Byte zurückgibt (der zu überprüfende Puffer könnte char, int, double oder float sein)?

Alle Ideen sind willkommen.

+0

Calloc() ruft malloc(), malloc.c ist über 5.322 Zeilen Code, so ist es nicht trivial, aber (ohne Nachforschungen) Ich glaube, dass es einen Zählwert kurz vor dem Start des Puffers gibt.Dies ist für mich sinnvoll, weil free() nichts über die von Calloc verwendeten Parameter weiß() – Marichyasana

+0

@Marichyasana Ihr Kommentar isn ' t über [tag: c], es ist über * einige * (hypothetische?) Implementation. Die Implementierung ist frei zu wählen, wie die Informationen für 'free()' arbeiten zu speichern. Ein dediziertes Größenfeld ist nicht notwendig, in Tatsache ist, dass wahrscheinlich nur ein Zeiger auf den nächsten Block einfacher ist.Natürlich könnten Sie Ihren eigenen Ersatz 'malloc()' implementieren, der auch eine Funktion 'sizeOfChunk()' bietet, aber das würde sei eine * Erweiterung * der Sprache. Und, sinnlos, weiß das Programm, das einen Chunk * zuweist, * die Größe (es hat es der Zuordnungsfunktion übergeben). –

Antwort

6

Zitiert C11, Kapitel §6.5.3.4, (emphasis Mine)

sizeof Der Bediener die Größe (in Bytes) des Operanden liefert, der eine Expression oder der geklammerten Name sein kann eine Art. Die Größe wird vom Typ des Operanden bestimmt. [...]

Also, mit sizeof Sie nicht die Größe des Speicherplatzes bekommen kann durch einen Zeiger gezeigt wird. Sie müssen das selbst verfolgen.

Um zu erarbeiten, entspricht Ihr Fall sizeof (double *), die im Grunde gibt Ihnen die Größe eines Zeigers (zu verdoppeln) gemäß Ihrer Umgebung.

Es gibt keine generische oder direkte Möglichkeit, die Größe des zugewiesenen Speichers aus einer Speicherzuordnungsfunktion abzurufen. Sie können jedoch bei der Verwendung ein sentinel value das Ende des zugewiesenen Puffer markieren und eine Schleife verwenden, können Sie den Wert überprüfen, aber das bedeutet

  • die Zuordnung eines zusätzlichen Element des Sentinel-Wert zu halten, selbst
  • der Sentinel-Wert muss von den zulässigen Werten im Speicher ausgeschlossen werden.

Wählen Sie nach Ihren Bedürfnissen.

+0

... Zitat Kapitel 11 von was ??? K & R? – d33j

+0

Vielen Dank. Ich habe gerade 'printf ("% zu \ n ", sizeof (double *)) getestet;' und hab '8'! Wie du gesagt hast: "Das musst du selbst verfolgen." Ich nehme an, du meinst, ich sollte wissen, dass die Größe dieses Puffers 8 * 4 = 40 Bytes ist, ist das korrekt? – Don

+2

@ d33j Entschuldigung? Ist die 'C11' nicht sichtbar? Das ist kein Kapitel, das ist der C-Standard. :) oh, und es ist Kapitel 6, BTW. –

2

sizeof(buf) ist die Größe der buf Variable, die ein Zeiger ist, nicht die Größe des Puffers, auf den es zeigt.

Aufgrund der Speicherausrichtungsanforderungen (durch die Hardware auferlegt) ist die Größe des Blocks, der mit calloc() zugewiesen wird, mindestens das Produkt der Werte, die Sie als Argumente an calloc() übergeben. In Ihrem Fall ist die Größe des Puffers mindestens 5 * sizeof(double).

Afaik gibt es keine Möglichkeit, die Größe eines dynamisch zugewiesenen Speicherblocks zu finden, aber solange Sie es zuweisen, kennen Sie seine Größe bereits; Sie müssen es übergeben als Argument an die Speicherzuweisungsfunktion (sei es malloc(), calloc(), realloc() oder andere.

+0

Danke. Gut erklärt :) – Don

Verwandte Themen