Как узнать длину области памяти на которую указывает указатель?

Допустим, у меня есть указатель на 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 шт):

Автор решения: AlexGlebe

Узнать размер можно, если вы сами напишите свой диспетчер памяти. В плюсах есть команда 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 ) ; }
→ Ссылка
Автор решения: avp

Можно получить, но не сколько запрашивали, а сколько выделила библиотека.

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

→ Ссылка