2012-01-03 12 views
8

Attualmente sto cercando di ottenere la lunghezza di un array generato dinamicamente. Si tratta di un array di struct:Come ottenere la lunghezza di una matrice di strutture creata in modo dinamico in C?

typedef struct _my_data_ 
{ 
    unsigned int id; 
    double latitude; 
    double longitude; 
    unsigned int content_len; 
    char* name_dyn; 
    char* descr_dyn; 
} mydata; 

ho inizializzare il mio allineamento del genere:

mydata* arr = (mydata*) malloc(sizeof(mydata)); 

E poi ridimensionato utilizzando realloc e ha cominciato a riempirlo con i dati.

Ho quindi tentato di ottenere le sue dimensioni utilizzando il codice descritto here.

sizeof(arr)/sizeof(arr[0]) 

Questa operazione restituisce anche se la mia matrice contiene due elementi.

Qualcuno potrebbe dirmi per favore cosa sto facendo male?

+0

Non è possibile ottenere a livello di codice la dimensione di un array allocato dinamicamente diverso salvando manualmente il dimensione in una variabile, usando un valore sentinella, ecc. –

risposta

14

Se è necessario conoscere la dimensione di un array con allocazione dinamica, è necessario tenere traccia di esso personalmente.

La tecnica sizeof(arr)/sizeof(arr[0]) funziona solo per gli array la cui dimensione è nota al momento della compilazione e per C99 variable-length arrays.

5

sizeof non può essere utilizzato per trovare la quantità di memoria allocata dinamicamente utilizzando malloc. È necessario memorizzare questo numero separatamente, insieme al puntatore al blocco assegnato della memoria. Inoltre, è necessario aggiornare questo numero ogni volta che si utilizza realloc o free.

+0

+1 per il problema dell'OP, ma questa risposta non è del tutto vera al 100% - hai ragione per 'malloc()', ma gli array di lunghezza variabile C99 * do * funzionano con 'sizeof'. –

+0

@CarlNorum Grazie per il chiarimento - Ho aggiornato la risposta per menzionare specificamente 'malloc'. – dasblinkenlight

2
mydata* arr = (mydata*) malloc(sizeof(mydata)); 

è un pointer e non un array. Per creare un array di due elementi di mydata, è necessario eseguire le seguenti operazioni

mydata arr[2]; 

In secondo luogo, di assegnare due elementi di mydata utilizzando malloc(), è necessario effettuare le seguenti operazioni:

mydata* arr = (mydata*) malloc(sizeof(mydata) * 2); 

OTOH, la lunghezza per la memoria allocata dinamicamente (usando malloc()) deve essere mantenuta dal programmatore (nelle variabili) - sizeof() non sarà in grado di seguirlo!

1

Stai cercando di utilizzare un trucco abbastanza noto per trovare il numero di elementi in un array. Sfortunatamente arr nel tuo esempio è non un array, è un puntatore. Quindi quello che stai ricevendo nella vostra divisione sizeof è:

sizeof(pointer)/sizeof(structure) 

che è probabilmente andando sempre essere 0.

Problemi correlati