Как узнать длину области памяти на которую указывает указатель?
Допустим, у меня есть указатель на unsigned int. Я могу написать, например:
unsigned int * intPtr = malloc(sizeof(unsigned int)*5);
for (int i= 0; i< 5; i++) intPtr[i]= i+1;
Заполнил в цикле для примера. Как мне узнать размер этой области памяти? Понятно, что сейчас эта область занимает 20 байт, но я хочу получить ее размер именно программно. То есть, если у меня есть указатель на char, я могу узнать его длину так:
unsigned char * chPtr = "exeple string\n";
unsigned int chPtrSize = strlen(chPtr);
Как нибудь можно в байтах узнать текущий размер выделенной памяти?
Ответы (2 шт):
Узнать размер можно, если вы сами напишите свой диспетчер памяти. В плюсах есть команда delete [ ] ptr ;. Она хранит размер массива где-то рядом, но не говорит где. Вы можете сами написать такое. Побочные эффекты это занимание лишних восемь байт памяти.
// gcc-9 -Wall -Wextra -Wpedantic -std=c11 memsize.c -o memsize
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
typedef struct s_malloc t_malloc ;
struct s_malloc {
size_t size ;
uint8_t memory [ ] ;
} ;
void * mem_alloc ( size_t const n ) {
t_malloc * const tm = malloc ( sizeof ( t_malloc ) + n ) ;
if ( tm ) {
tm -> size = n ;
return & tm -> memory ; }
return 0 ; }
size_t mem_size ( void * const ptr ) {
return * ( size_t * ) ( ( ( uint8_t * ) ptr )
- offsetof ( t_malloc , memory )
+ offsetof ( t_malloc , size ) ) ; }
void mem_free ( void * const ptr ) {
free ( ( ( uint8_t * ) ptr ) - offsetof ( t_malloc , memory ) ) ; }
int main ( ) {
char * str = mem_alloc ( 10 ) ;
str [ 0 ] = '\00' ;
printf ( u8"размер памяти = %zu\n" , mem_size ( str ) ) ;
mem_free ( str ) ; }
Можно получить, но не сколько запрашивали, а сколько выделила библиотека.
malloc_usable_size(3) — Linux manual page
Комментарий из /usr/include/malloc.h
/* Report the number of usable allocated bytes associated with allocated
chunk __ptr. */
extern size_t malloc_usable_size (void *__ptr) __THROW;
Пример программы
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int
main (int ac, char *av[])
{
void *p = malloc(100);
size_t s = malloc_usable_size(p);
printf("%p %zd\n", p, s);
return puts("End") == EOF;
}
Транслируем и запускаем
avp@avp-xubu2:~/hashcode$ gcc t-malloc_usable_size.c
avp@avp-xubu2:~/hashcode$ ./a.out
0x55f36e329260 104
End
avp@avp-xubu2:~/hashcode$
В windows есть аналогичная функция с названием _msize