Как определить, сколько места выделено вызовом malloc ()?

Я пытаюсь написать такую ​​функцию размера, как это:

size(void *p,int size); 

Которая вернет размер массива, на который указывает p. Например:

 Int *a = malloc((sizeof(int)*100)); size(a,sizeof(int)); // this should return 100 

Я думаю, что это возможно, потому что, если я помню, malloc отслеживает пространство, выделенное в некоторых байтах заголовка.

Вот что я до сих пор:

 int size(void *p, int size) { p = (unsigned int *)p - 1; unsigned int elements = (*(unsigned int *)p); return elements/size; } 

Теперь, предполагая, что размер выделенного пространства находится в 4 байтах перед указателем, это должно возвращать байты или смещение. Здесь я немного в темноте. Я не могу понять особенности того, как malloc форматирует эти байты заголовка. Как malloc упаковывает бит заголовка?

Спасибо, я ценю это. Я уверен, что с этим кодом есть что-то не так, и это не особенно портативно и может быть очень системным, но я делаю это для удовольствия.

Если вам нравится заглядывать и выталкивать вас за пределы памяти, возвращаемой malloc (), я рекомендую получить исходный код вашего распределителя. Это будет быстрее и безопаснее, чем экспериментировать. 😉

В Visual Studio вы можете использовать _msize() .

Я думаю, вы полагаетесь на какое-то поведение malloc() специфичное для реализации. Реализация malloc() является системной, и в спецификации очень мало сказано о том, как это выполняется.

Нет никакого портативного способа сделать это. Как говорили другие, либо посмотрите на код вашего распределителя, если вы делаете одноразовую программу, просто выкапывающую, или для некоторых библиотек (MS) есть расширения, такие как _msize . malloc разрешает делать то, что хочет внутри распределителя, отслеживать материал, и нет никакого «безопасного» или стандартного способа получения этих данных.

Если вам действительно нужна эта возможность в реальном приложении, вам нужно будет создать прокладку вокруг malloc/free которая хранит таблицу размеров размещения.

Вы можете обнаружить, что функции, связанные с glibc malloc, могут быть полезны. В частности, вы можете вызвать mallinfo() чтобы получить информацию о куче. Некоторые системы также определяют malloc_size , который является эквивалентом BSD для _msize .

Если вы действительно хотите пройти этот маршрут, dlmalloc (malloc, используемый для glibc и uClibc среди других) имеет некоторые документы на странице http://g.oswego.edu/dl/html/malloc.html . Кроме того, поиск в Google для того, как использовать переполнение кучи, вероятно, даст вам подробную информацию для каждой платформы, в том числе без исходного кода.

Это не стандарт. Но для этого существуют определенные для платформы функции, такие как _msize или malloc_usable_size .