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?
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).
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.
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.
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?
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)
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.