Usar sizeof con una matriz dinámicamente asignada

gcc 4.4.1 c89

Tengo el siguiente fragmento de código:

#include  #include  char *buffer = malloc(10240); /* Check for memory error */ if(!buffer) { fprintf(stderr, "Memory error\n"); return 1; } printf("sizeof(buffer) [ %d ]\n", sizeof(buffer)); 

Sin embargo, el tamaño de (búfer) siempre imprime 4. Sé que un char * tiene solo 4 bytes. Sin embargo, he asignado la memoria para 10kb. Entonces, ¿no debería el tamaño ser 10240? Me pregunto, ¿estoy pensando aquí?

Muchas gracias por las sugerencias,

Está pidiendo el tamaño de un char* que es 4 en realidad, no el tamaño del buffer. El operador sizeof no puede devolver el tamaño de un búfer asignado dinámicamente, solo el tamaño de los tipos y estructuras estáticos conocidos en tiempo de comstackción.

sizeof no funciona en asignaciones dinámicas (con algunas excepciones en C99). Su uso de sizeof aquí le está dando el tamaño del puntero. Este código le dará el resultado que desea:

 char buffer[10240]; printf("sizeof(buffer) [ %d ]\n", sizeof(buffer)); 

Si malloc() tiene éxito, la memoria apuntada es al menos tan grande como usted pidió, por lo que no hay ninguna razón para preocuparse por el tamaño real que asignó.

Además, has asignado 10 kB, no 1 kB.

Depende de usted hacer un seguimiento del tamaño de la memoria si la necesita. La memoria devuelta por malloc es solo un puntero a los datos “no inicializados”. El operador sizeof solo está trabajando en la variable buffer .

No. El buffer es un char * . Es un puntero a los datos de char . El puntero solo ocupa 4 bytes (en su sistema).

Apunta a 10240 bytes de datos (que, por cierto, no es 1Kb. Más como 10Kb), pero el puntero no lo sabe . Considerar:

 int a1[3] = {0, 1, 2}; int a2[5] = {0, 1, 2, 3, 4}; int *p = a1; // sizeof a1 == 12 (3 * sizeof(int)) // but sizeof p == 4 p = a2 // sizeof a2 == 20 // sizeof p still == 4 

Es la principal diferencia entre matrices y punteros. Si no funciona de esa manera, sizeof p cambiaría en el código anterior, lo que no tiene sentido para una constante de tiempo de comstackción.

Reemplace su sizeof por malloc_usable_size (la malloc_usable_size de malloc_usable_size indica que esto no es portátil, por lo que puede no estar disponible con su implementación particular de C).