¿Cómo obtener la longitud de una matriz de estructuras creadas dinámicamente en C?

Actualmente estoy tratando de obtener la longitud de una matriz generada dinámicamente. Es una serie de estructuras:

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

Intializo mi matriz de esa manera:

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

Y luego lo redimensionó usando realloc y comencé a llenarlo con datos.

Luego intenté obtener su tamaño usando el código descrito aquí .

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

Esta operación devuelve 0 a pesar de que mi matriz contiene dos elementos.

¿Podría alguien decirme qué estoy haciendo mal?

Si necesita saber el tamaño de una matriz asignada dinámicamente, debe realizar un seguimiento de la misma.

La técnica sizeof(arr) / sizeof(arr[0]) solo funciona para matrices cuyo tamaño se conoce en tiempo de comstackción, y para matrices de longitud variable de C99.

No se puede usar sizeof para encontrar la cantidad de memoria que asignó dinámicamente usando malloc . Debe almacenar este número por separado, junto con el puntero a la porción de memoria asignada. Además, debes actualizar este número cada vez que uses realloc o free .

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

Es un pointer y no una array . Para crear una array de dos elementos de mydata , debe hacer lo siguiente

 mydata arr[2]; 

En segundo lugar, para asignar dos elementos de mydata usando malloc() , debe hacer lo siguiente:

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

OTOH, la longitud de la memoria asignada dinámicamente (utilizando malloc() ) debe ser mantenida por el progtwigdor (en las variables) – ¡ sizeof() no podrá rastrearla!

Estás tratando de usar un truco bastante conocido para encontrar el número de elementos en una matriz. Desafortunadamente, en tu ejemplo, arr no es una matriz, es un puntero. Entonces, lo que estás obteniendo en tu sizeof división es:

 sizeof(pointer) / sizeof(structure) 

Lo que probablemente siempre va a ser 0.