2010-10-07 6 views
7

estoy tratando de escribir una función del tamaño de esta manera:¿Cómo encontrar la cantidad de espacio asignada por una llamada a malloc()?

size(void *p,int size); 

cual se devolvía el tamaño de una matriz que está apuntado por p. Por ejemplo:

Int *a = malloc((sizeof(int)*100)); 
size(a,sizeof(int)); // this should return 100 

creo que esto es posible porque si no recuerdo, malloc no pierde de vista el espacio asignado en algunos bytes de cabecera.

Esto es lo que tengo hasta ahora:

int size(void *p, int size) 
{ 
    p = (unsigned int *)p - 1; 
    unsigned int elements = (*(unsigned int *)p); 
    return elements/size; 
} 

Ahora, suponiendo que el tamaño del espacio asignado está en los 4 bytes antes de que el puntero, esto debe devolver los bytes, o compensar. Aquí es donde estoy un poco en la oscuridad. No puedo entender los detalles de cómo Malloc formatea estos bytes de encabezado. ¿Cómo Malloc empaqueta los bits del encabezado?

Gracias, lo agradezco. Estoy seguro de que hay cosas mal con este código y no es particularmente portátil y puede depender mucho del sistema, pero lo hago por diversión.

+3

Si puede hacer que esto funcione, solo funcionará en su implementación particular de 'malloc'. Otro sistema puede usar un 'malloc' diferente e intentar desviar el puntero después de moverlo hacia atrás más allá del final de la matriz podría causar una violación de acceso a la memoria y bloquear su aplicación.Una forma más confiable es registrar el tamaño de la región de la memoria cuando se llama 'malloc', y hacer referencia a ese valor en lugar de intentar analizar los metadatos de' malloc'. – bta

+0

No hagas esto. Si necesita saber el tamaño, guárdelo usted mismo, pero probablemente ni siquiera sea útil en la mayoría de los casos. Tenga en cuenta que una implementación futurista avanzada de C * * no almacenará el tamaño en cualquier lugar que sea accesible desde su programa, no tendrá conversiones entre punteros y tipos enteros, y realmente atrapará y abortará el programa si incrementa o disminuye un puntero más allá de los límites del objeto o intente hacer aritmética en punteros a diferentes objetos. El estándar permite esta flexibilidad de implementación por muy buenas razones. –

+1

Supongamos que su 'malloc' está restringido para asignar bloques de potencia de dos. Supongamos que tiene una matriz de tamaño dinámico de objetos de 12 bytes y solicita una capacidad inicial de 100. Si hace las cosas según el estándar C, tiene que 'realloc' cuando su matriz crece a 100 elementos. Si pudiera obtener el tamaño real del bloque, podría dejar que su matriz crezca a 170 elementos antes de reasignarlo. Entonces, hay una ventaja de eficiencia al poder obtener el tamaño del bloque. – dan04

Respuesta

6

Si te gusta echar un vistazo más allá de la memoria tu malloc() regresa, te recomiendo obtener el código fuente de tu asignador. Esto será más rápido y más seguro que experimentar. ;-)

4

Creo que confía en algún comportamiento de implementación específico de malloc(). La implementación de malloc() es específica del sistema y el specification menciona muy poco acerca de cómo se realiza esto.

2

No hay forma portátil de hacerlo. Como han dicho otros, o bien mira el código de tu asignador si estás haciendo un único programa que está hurgando, o para algunas bibliotecas (MS) hay extensiones como _msize. malloc tiene permitido hacer lo que quiera dentro del asignador para rastrear cosas, y no existe una forma "segura" o que cumpla con los estándares de obtener esa información.

Si realmente necesita esta capacidad de manera confiable en una aplicación real, tendrá que construir un calce alrededor de malloc/free que mantenga una tabla de tamaños de asignación.

0

Si realmente desea ir por ese camino, dlmalloc (malloc utilizado en glibc y uClibc entre otros) tiene algunos documentos en http://g.oswego.edu/dl/html/malloc.html. Además, buscar en Google cómo explotar los desbordamientos del montón probablemente le proporcione los detalles de cada plataforma, incluidos los que no tienen el código fuente disponible.

Cuestiones relacionadas