2011-07-26 16 views

Respuesta

3

Es un secreto profundo que solo free() sabe con certeza. Es probable que esté en su sistema, pero de una manera totalmente dependiente de la implementación.

un poco incómodo, pero si quieres mantener todo junto:

typedef struct 
{ // size of data followed by data (C only trick! NOT for C++) 
    int  dimension; // number of data elements 
    int  data[1];  // variable number of data elements 
} malloc_int_t; 

malloc_int_t *ab; 

int dimension = 10; 
ab = malloc(sizeof(*ab) + (dimension-1)*sizeof(int)); 
ab->dimension = dimension; 

ab->data[n] // data access

he cambiado el tipo de datos a int para hacer que el código de una plantilla de más genérico.

+0

Incluso free() no necesariamente lo sabe. malloc (10) podría asignar, digamos, 16 bytes; free() solo necesita saber acerca de los 16 bytes realmente asignados, no los 10 bytes solicitados. –

+0

Sí ... y considero esa parte de "implementación específica". – Gilbert

0

El tamaño es el que pasó a malloc, puede utilizar una variable global o macro para recordarlo.

1

No, desafortunadamente.

Debe pasar el tamaño del bloque junto con el puntero.

1

No hay forma, tiene que almacenar el tamaño de la memoria asignada en otra variable.

2

No se puede (transportable de todos modos). Tienes que hacer un seguimiento del tamaño tu mismo.

Algunas implementaciones de malloc podrían darle una API para acceder a esa información, pero no hay disposiciones en el estándar para esto.

7

No, no tiene una forma estándar de hacerlo. Debe pasar el tamaño de la memoria apuntada junto con el puntero, es una solución común.

I.e. en lugar de

void f(char* x) 
{ 
    //... 
} 

uso

void f(char *x, size_t length) 
{ 
    //.... 
} 

y en su código

char *ab = malloc(10); 
f(ab, 10); 
+4

Sugeriría que el prototipo de la función sea 'void f (char * x, size_t length)'. 'size_t' representa mejor el tipo de valor que se pasa y también coincide con el tipo del argumento a' malloc'. –

0

No hay forma de deducir el tamaño de memoria asignada desde el propio puntero. Como ab es char *, sizeof(ab) es lo mismo que sizeof(char *), que obviamente no es lo mismo que el tamaño del trozo de memoria asignado.

Dado que llamó al malloc con el tamaño requerido, usted sabe de qué tamaño es. Pase este número junto con el puntero a la función que necesita saber el tamaño.

1

Ahora, dicho esto, hay hacks no portátiles para hacer esto, pero no es seguro confiar en ellos.

Si sabe con 100% de certeza que la memoria fue asignada vía malloc(), puede rebobinar el puntero unos pocos bytes e inspeccionar el 'nodo malloc' que se utiliza para rastrear qué partes de la memoria han sido asignados y que no tienen. Sin embargo, no puedo enfatizar esto lo suficiente, nunca dependas de esto.

0

Tenía una estructura y un puntero de char apuntando a su dirección de memoria. Entonces, relacionándolo con su pregunta, quería encontrar el tamaño de la ubicación de la memoria a la que apuntaba, es decir, el tamaño de la estructura. Entonces, lógicamente, lo que hace es encontrar el tamaño del objeto creado por el puntero. Esto funcionó para mí:

unsigned char * buffer= Library1Structure; 
int x=sizeof(Library1Structure); 

lo tanto, el valor de x me dice el tamaño de la posición de memoria los puntos de amortiguamiento puntero.

+0

necesito saber el tamaño de la memoria apuntada en diferentes funciones donde no tengo acceso a "Library1Structure" –

+0

Declarar library1structure en el archivo de encabezado, entonces ... –

Cuestiones relacionadas