Как определить размер выделенного буфера C?

у меня есть буфер и я хочу сделать тест, чтобы увидеть, имеет ли буфер достаточную емкость, т. е. найдите количество элементов, которые я могу добавить в буфер.

char *buffer = (char *)malloc(sizeof(char) * 10);

делать

int numElements = sizeof(buffer); 

не возвращает 10, какие-либо идеи о том, как я могу это сделать?

6 ответов


buffer - Это просто указатель без указания размера. Однако процедура malloc() будет содержать размер выделенного вами выделения, поэтому, когда вы освободите () его, он освободит нужное количество места. Поэтому, если вы не хотите погружаться в функциональность malloc (), я рекомендую вам просто сохранить размер распределения самостоятельно. (для возможной реализации см. пример в другом ответе API).


для GNU glibc:

SYNOPSIS

#include <malloc.h>
size_t malloc_usable_size (void *ptr);

описание

функция malloc_usable_size () возвращает количество используемых байтов в блоке, на который указывает ptr, указатель на блок памяти, выделенный malloc (3) или связанной функцией.


вы не можете сделать такой тест. Это ваша собственная ответственность, чтобы помнить, сколько памяти выделено. Если буфер предоставлен вам кем-то другим, требуйте, чтобы они также передали информацию о размере и взяли на себя ответственность передать правильное значение или заставить программу умереть.


С buffer указатель (не массив), то sizeof оператор возвращает размер указателя, а не размер буфера, на который он указывает. Нет стандартного способа определить этот размер, поэтому вы должны сами вести бухгалтерию (т. е. помнить, сколько вы выделили.)

кстати, это то же самое для

 char *p = "hello, world\n"; /* sizeof p is not 13. */

интересно, что

 sizeof "hello, world\n"

is 14. Догадываешься почему?


struct buffer
{
  void
    *memory

  size_t
    length;
};

void *buffer_allocate( struct buffer *b, size_t length )
{
  assert( b != NULL );

  b->memory = malloc( length )
  b->length = length;

      // TRD : NULL on malloc() fail
      return( b->memory );
}

int buffer_valid( struct buffer *b, size_t length )
{
  assert( b != NULL );

  if( b->memory == NULL or length > b->length )
    return( 0 );

  return( 1 );
}

void *buffer_get( struct buffer *b )
{
  assert( b != NULL );

  return( b->memory );
}

используйте API, а не malloc/free, и вы не можете ошибиться.


sizeof используется для вычисления размера для реальных объектов, а не указателей для объектов в памяти. Он возвращает размер структур или примитивов. Я имею в виду, что он будет работать, но даст вам размер указателя, а не структуру, на которую он указывает. Чтобы получить длину любого массива, используйте:

функция strlen(буфер)