[C con Clase] Ayuda Manejo De Memoria

Steven Davidson srd4121 en njit.edu
Sab Jul 19 23:28:58 CEST 2008


Hola Diego,

D1e6o! wrote:
> Buenas...
> 
> Tengo problemas con el manejo de memoria.
> 
> A veces, necesito matrices muy grandes y no se cual es la forma
> correcta de operar...
> 
> Debería usar malloc, supongo...? y los punteros, deben ser de algun

Si se trata de arrays muy grandes o arrays cuyos tamaños son 
desconocidos en tiempo de compilación, entonces necesitas usar técnicas 
para manejar memoria dinámicamente.

Si estás usando C, entonces sí necesitas usar 'malloc()', pero si usas 
C++, entonces sugiero usar 'new[]'.

> tipo en especial? Son necesarios los punteros especiales? y cual es el
> tipo de puntero por defecto?
> 

No sé a qué te refieres con "punteros especiales" ni con "puntero por 
defecto". Es posible que estés pensando en 'void *' que a veces se llama 
"puntero genérico".

> Se que es muy general mi pregunta, pero me genera muchos problemas.
> 
> Por ejemplo, si necesito crear una tabla de 20000*10000 del tipo char,
> cual sería la forma óptima de hacerlo?
> 

Necesitaremos un puntero doble; esto,

char **pMatriz;

Ahora bien, tenemos dos formas de implementar el concepto de una matriz:

1. Crear un array dinámico de punteros e ir creando cada cadena 
independientemente.

2. Crear un array dinámico de punteros pero crear una única cadena. Esto 
parece más bien un solo array de 200000000 'char' en vez de tener varias 
cadenas "sueltas".


Por simpleza, usaremos el método #1. Básicamente, tenemos que crear un 
array de punteros, que en nuestro modelo de "matriz", podemos pensar que 
se trata de crear "las filas":

pMatriz = new char*[20000];  // 20000 "filas"

Ahora creamos cada cadena asignándola a cada puntero; o dicho de otra 
forma, creamos las columnas para cada fila:

for( int f=0; f<20000; f++ )
   pMatriz[f] = new char[10000];  // Cada fila tiene 10000 columnas

Ya hemos creado la matriz de 'char' o la lista de cadenas de caracteres, 
según cómo lo mires.


Sugiero consultar el capítulo 17 de nuestro curso de C++: 
http://c.conclase.net/curso/index.php?cap=017


Espero que esto te ayude.

Steven





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