[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