web-dev-qa-db-fra.com

Comment déterminer la taille d'un tampon C alloué?

J'ai un tampon et je veux faire un test pour voir si le tampon a une capacité suffisante. trouver le nombre d'éléments que je peux ajouter au tampon.

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

Faire un

int numElements = sizeof(buffer); 

ne retourne pas 10, des idées sur la façon dont je peux accomplir cela?

9
godzilla

buffer est juste un pointeur sans information de taille. Cependant, la routine malloc () conservera la taille de l'allocation que vous avez faite. Ainsi, lorsque vous la libérez (), elle libère la bonne quantité d'espace. Donc, à moins que vous ne vouliez plonger dans la fonctionnalité malloc (), je vous recommande simplement de sauvegarder la taille de l'allocation vous-même. (pour une implémentation possible, voir l'exemple dans l'autre réponse de l'API).

5
Evert

Pour GNU glibc:

SYNOPSIS

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

LA DESCRIPTION

La fonction malloc_usable_size () renvoie le nombre d'octets utilisables dans le bloc pointé par ptr, un pointeur sur un bloc de mémoire alloué par malloc (3) ou une fonction associée.

21
Vitaly

Vous ne pouvez pas faire un tel test. Il est de votre responsabilité de vous rappeler combien de mémoire vous avez alloué. Si le tampon vous est donné par quelqu'un d'autre, demandez-lui de transmettre également les informations de taille et attribuez-lui la responsabilité de transmettre la valeur correcte ou de faire mourir le programme.

13
Kerrek SB

Puisque buffer est un pointeur (et non un tableau), l'opérateur sizeof renvoie la taille d'un pointeur, pas la taille de la mémoire tampon vers laquelle il pointe. Il n’existe pas de méthode standard pour déterminer cette taille, vous devez donc effectuer vous-même la comptabilité (c’est-à-dire combien vous avez alloué.)

BTW, c'est pareil pour

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

Intéressant,

 sizeof "hello, world\n"

est 14. Pouvez-vous deviner pourquoi?

7
Jens

sizeof est utilisé pour calculer la taille des objets réels, pas les pointeurs des objets en mémoire. Il retourne la taille des structures ou des primitives. Je veux dire que cela fonctionnera, mais vous donnera la taille du pointeur, pas la structure à laquelle il pointe. Pour obtenir la longueur de tout type de tableau, utilisez:

strlen (tampon)

0
SpaceBear
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 );
}

Utilisez l'API et non malloc/free et vous ne pouvez pas vous tromper.

0
user82238