Не существует общего (стандартизированного) способа сделать это, поскольку реализация malloc
зависит от системы и архитектуры. Единственное гарантированное поведение заключается в том, что malloc(N)
вернет не менее N байтов или NULL. malloc
всегда выделяет больше памяти, чем запрошено, - для хранения запрошенного размера (N) и, как правило, некоторых дополнительных учетных данных.
Для Windows / Visual C ++:
Дополнительные данные сохраняются в сегменте памяти перед тем, адрес которого возвращается malloc
.
Если p = malloc(N)
и p != 0
, вы можете использовать следующий код, чтобы определить объем памяти, запрашиваемый, если вы знаете только p
:
Windows NT: unsigned long ulAllocSize = *((unsigned long*)p - 4);
Windows CE: unsigned long ulAllocSize = *((unsigned long*)p - 2);
Обратите внимание, что ulAllocSize
- это не размер всего блока, выделенного с malloc
, а только значение, переданное в качестве аргумента - N
.