Ich versuche, eine Größenfunktion wie folgt zu schreiben:
%Vor%Dies würde die Größe eines Arrays zurückgeben, auf das p zeigt. Zum Beispiel:
%Vor%Ich denke, das ist möglich, denn wenn ich mich erinnere, verfolgt malloc den Platz, der in einigen Header-Bytes zugewiesen wurde.
Folgendes habe ich bisher:
%Vor%Wenn nun angenommen wird, dass die Größe des zugewiesenen Speicherplatzes in den 4 Bytes vor dem Zeiger liegt, sollte dies die Bytes oder den Offset zurückgeben. Hier bin ich ein wenig im Dunkeln. Ich kann nicht herausfinden, wie malloc diese Header-Bytes formatiert. Wie verpackt Malloc die Header-Bits?
Danke, ich weiß das zu schätzen. Ich bin mir sicher, dass mit diesem Code etwas nicht stimmt und dass es nicht besonders portabel ist und möglicherweise sehr systemabhängig ist, aber ich mache es zum Spaß.
Ich denke, Sie verlassen sich auf ein umsetzungsspezifisches Verhalten malloc()
. Die Implementierung von malloc()
ist systemspezifisch und die Spezifikation erwähnt sehr wenig darüber durchgeführt.
Es gibt keinen tragbaren Weg, dies zu tun. Wie andere bereits gesagt haben, schauen Sie sich den Code Ihres Allokators an, wenn Sie ein einmaliges Programm machen, das nur herumstochert, oder für einige Bibliotheken (MS) gibt es Erweiterungen wie _msize
. malloc
darf innerhalb des Allokators tun, was es will, um Dinge zu verfolgen, und es gibt keine "sichere" oder standardkonforme Art, diese Daten zu bekommen.
Wenn Sie diese Funktion in einer echten Anwendung wirklich benötigen, müssen Sie eine Unterroutine um malloc/free
erstellen, die eine Tabelle mit Zuordnungsgrößen enthält.
Sie finden möglicherweise die glibc malloc-bezogenen Funktionen um nützlich zu sein. Insbesondere können Sie mallinfo()
aufrufen um Heap-Informationen zu erhalten. Einige Systeme definieren auch malloc_size
, was das BSD-Äquivalent von _msize
.
Wenn Sie wirklich diese Route verwenden möchten, hat dlmalloc (das malloc, das unter anderem auf glibc und uClibc verwendet wird) einige Dokumente unter Ссылка . Wenn Sie nach Heap-Überläufen suchen, erhalten Sie wahrscheinlich auch Details für jede Plattform, einschließlich solche ohne Quellcode.
Es ist nicht im Standard. Dafür gibt es plattformspezifische Funktionen wie _msize
oder malloc_usable_size
.
Tags und Links c memory-management malloc