[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