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.
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
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. –
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