Come determinare la dimensione di un buffer C allocato?

Ho un buffer e voglio fare un test per vedere se il buffer ha una capacità sufficiente, trovo il numero di elementi che posso aggiungere al buffer.

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

Fare un

 int numElements = sizeof(buffer); 

non restituisce 10, qualche idea su come posso realizzare questo?

buffer è solo un puntatore senza informazioni sulle dimensioni. Tuttavia la routine malloc () manterrà la dimensione dell’allocazione che hai fatto in modo che quando sei libero (), liberi la giusta quantità di spazio. Quindi, a meno che non vogliate immergervi nella funzionalità malloc (), vi consiglio di salvare voi stessi la dimensione dell’allocazione. (per una ansible implementazione, vedere l’esempio nell’altra risposta API).

Per GNU glibc:

 SYNOPSIS #include  size_t malloc_usable_size (void *ptr); 

DESCRIZIONE

La funzione malloc_usable_size () restituisce il numero di byte utilizzabili nel blocco a cui punta ptr, un puntatore a un blocco di memoria assegnato da malloc (3) o una funzione correlata.

Non puoi fare un test del genere. È tua responsabilità ricordare quanto memoria hai assegnato. Se il buffer ti è stato dato da qualcun altro, chiedigli di passare anche le informazioni sulla dimensione e di assumersi la responsabilità di trasmettere il valore corretto o far morire il programma.

Poiché il buffer è un puntatore (non un array), l’operatore sizeof restituisce la dimensione di un puntatore, non la dimensione del buffer a cui punta. Non esiste un modo standard per determinare questa dimensione, quindi devi fare tu stesso la contabilità (es. Ricorda quanto hai assegnato).

A proposito, è lo stesso per

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

È interessante notare che,

  sizeof "hello, world\n" 

è 14. Riesci a indovinare perché?

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

Usa l’API e non malloc / free e non puoi sbagliare.

sizeof è usato per calcolare le dimensioni degli oggetti reali, non i puntatori per gli oggetti in memoria. Restituisce la dimensione delle strutture o delle primitive. Voglio dire che funzionerà, ma ti darà la dimensione del puntatore, non la struttura a cui punta. Utilizzare la lunghezza di qualsiasi tipo di array:

strlen (buffer)