2010-10-03 6 views
5
void func(int *p) 
{ 
    // Add code to print MEMORY SIZE which is pointed by pointer P. 
} 
int main() 
{ 
    int *p = (int *) malloc (10); 
    func(p); 
} 

¿Cómo podemos encontrar MEMORY SIZE del puntero de memoria P in func()?¿Cómo podemos encontrar el TAMAÑO DE MEMORIA del puntero de memoria dado?

+3

No puede hacer esto de forma portátil. –

+0

aquí no hay 'P' en su fragmento de arriba. Y debe pasar el tamaño a la función si lo necesita allí (o tiene un valor de detención) – pmg

+0

Podemos encontrar el tamaño de memoria asignado dinámicamente desde el puntero de memoria P. (P-1) apunta al encabezado del bloque de memoria y * (P -1) le da el tamaño de memoria asignado. NOTA: * (P-1) no le da el tamaño exacto de la memoria pero da "memoria asignada + tamaño del encabezado del bloque de memoria + tamaño de la cola del bloque de memoria" – siva

Respuesta

10

No hay forma legal de hacerlo en C (o incluso en C++, creo). Sí, de alguna manera free sabe cuánto fue malloc ed pero lo hace de una manera que no es visible o accesible para el programador. Para usted, el programador, también podría haberlo hecho magic!

Si decides probar y decodificar lo que malloc y libre hace, entonces te llevará por el camino de las implementaciones de compiladores patentados. Tenga en cuenta que incluso en el mismo sistema operativo, diferentes compiladores (o incluso versiones diferentes del mismo compilador, o incluso el mismo compilador, pero que utilizan una implementación malloc de terceros (sí existen tales cosas)) pueden hacerlo de forma diferente.

+0

¡e incluso el mismo compilador pero usando diferentes indicadores de compilación! Buena respuesta, pero también sugiero incluir 'malloc()' (es decir, escribir y usar 'my_ * alloc()' y 'my_free()'.) – aib

1

Si programa para Microsoft Windows, puede usar las funciones Heap * API de Windows en lugar de las funciones proporcionadas por su lenguaje de programación (C en su caso). Puede asignar memoria con HeapAlloc, reasignar con HeapReAlloc, liberar memoria con HeapFree y, finalmente, obtener el tamaño de un bloque previamente asignado con la función HeapSize.

Otra opción, por supuesto, es escribir funciones de contenedor para malloc y amigos, que almacenan un índice de bloques asignados y sus tamaños. De esta forma puede trabajar con sus propias funciones para asignar, reasignar, liberar y medir bloques de memoria. Escribir tales funciones de envoltura debería ser trivial (aunque no conozco C, así que no puedo hacerlo por ti ...).

+0

Espero que sea mucho más lento por asignación que usar el montón de la biblioteca de tiempo de ejecución de C, y desperdicio de pequeñas asignaciones. – ChrisW

3

En el desarrollo de aplicaciones, para conocer el tamaño de la memoria asignada a un puntero, que realmente prestamos atención en el momento en que asignamos memoria para él, que en su caso es:

int *p = (int *) malloc(10); 

y luego almacenamos esta información en algún lugar si necesitamos usarlo en el futuro. Algo como esto: hace

void func(int *p, size_t size) 
{ 
    printf("Memory address 0x%x has %d bytes allocated for it!\n", p, size); 
} 

int main() 
{ 
    int my_bytes = 10; 
    int *p = malloc(my_bytes); 
    func(p, my_bytes); 

    return 0; 
} 
+0

Esto está bien para un ejemplo muy simple o artificial, pero si su programa tiene miles o millones de asignaciones de memoria, su mecanismo para almacenar punteros y longitudes será * muy * eficiente. –

+0

Lo señalé solo porque creo que @siva podría estar mirando de la manera incorrecta para resolver su problema. – karlphillip

+1

Tengo curiosidad por saber por qué esta respuesta es rechazada. ¿Por favor? OMI, la respuesta refleja la realidad de nuestro día a día. Dudo que la mayoría de los programadores C darían una respuesta diferente. – jweyrich

2

muchos años, programada en un sistema UNIX que tenía una función msize stdlib que devolvería más o menos lo que quiere. Desafortunadamente, nunca se convirtió en parte de ningún estándar.

msize llamada en un puntero devuelto desde malloc o realloc devolvería la cantidad real de memoria que el sistema había asignado para el programa de usuario en esa dirección (que podría ser más de lo solicitado, si llegara redondea por razones de alineación o lo que sea)

+0

MSVC admite _msize también son parte del CRT: http://msdn.microsoft.com/en-us/library/z2s077bc(v=VS.80).aspx – Necrolis

0

En primer lugar, como todos los demás han dicho, no existe una forma portátil de saber el tamaño en la asignación a menos que guarde esta información.

Todo lo que importa es la implementación de la biblioteca C estándar. La mayoría de las bibliotecas solo mantienen el tamaño de la memoria asignada a un puntero, que generalmente es más grande que el tamaño que solicita su programa. Permitir que la biblioteca mantenga el tamaño solicitado es una mala idea porque cuesta más memoria y a veces no nos importa el tamaño solicitado.

Estrictamente hablando, la grabación del tamaño solicitado NO es una característica de un compilador. Parece que a veces se debe a que un compilador puede volver a implementar parte de la biblioteca estándar y anular la predeterminada del sistema.Sin embargo, no utilizaría una biblioteca para registrar el tamaño solicitado porque es probable que tenga una mayor huella de memoria debido a la razón que mencioné anteriormente.

Cuestiones relacionadas