[C con Clase] Ayuda Manejo De Memoria

Steven Davidson srd4121 en njit.edu
Lun Jul 21 06:34:34 CEST 2008


Hola Diego,

D1e6o! wrote:
> Hola.
> 
> Steven: Muchas gracias por toda tu ayuda, que es de muy buen nivel!
> 
> 
> Si yo quisiera tratarlo como una matriz tabla[y][x] del tamaño MAX-1,
> 2*MAX-1o sea char tabla[MAX-1][MAX*2-1]; estaría bien hacerlo así?
> ...
> #define MAX 101
> ...
> tabla=(char**)malloc(sizeof(char*)*(MAX-1));
> *tabla=(char*)malloc((2*MAX-1)*MAX*sizeof(char));

No es necesario calcular el tamaño de 'char', ya que siempre ocupa 1 
byte. En general, sí necesitarás averiguar su tamaño.

> for(cuenta=0; cuenta<MAX;cuenta++)tabla[cuenta]=&tabla[0][(2*MAX-1)*cuenta];

Casi. Usaríamos 'MAX-1', pero el problema más grave es que empiezas el 
índice 'cuenta' con 0 (cero). Recuerda que ya has asignado la dirección 
de memoria al primer puntero con el segundo 'malloc()'. Por lo tanto, 
debes empezar con 'tabla[1]'. A la ahora de hacer las asignaciones para 
los punteros, necesitas conseguir el puntero anterior y sumar la 
cantidad de bytes para calcular el comienzo del nuevo bloque (o fila).

Al final, deberías tener algo así:

*tabla = (char*)malloc( (2*MAX-1)*(MAX-1));
for( cuenta=1; cuenta<MAX-1; cuenta++ )
   tabla[cuenta] = tabla[(2*MAX-1)*(cuenta-1)];

Como puedes ver, no es necesario acceder a la dirección de la memoria 
del primer elemento de cada bloque, sino simplemente el puntero que ya 
tenemos guardado.

Si quieres, podemos cambiar el bucle para que no tengamos que usar 
'cuenta-1' en el cálculo del índice, para mejorar la legibilidad - un 
poco. Esto sería,

for( cuenta=0; cuenta<MAX-2; cuenta++ )
   tabla[cuenta+1] = tabla[(2*MAX-1)*cuenta)];

> 
> Por lo menos lo compila sin problemas, pero no se si estará bien
> 
> Y para llenar con 0 la matriz por completo estaría bien hacerlo así?
> 
> memset(&tabla[0][0],0,(MAX-1)*(2*MAX-1));
> 

Sí, pero tampoco es necesario conseguir el primer elemento para luego 
conseguir su dirección de memoria. Ya tenemos ese puntero guardado en el 
primer elemento de 'tabla'. Esto es,

memset( tabla[0], 0, (MAX-1)*(2*MAX-1) );


Espero que esto te sirva.

Steven





Más información sobre la lista de distribución Cconclase