Pregunta Memoria Dinámica En "Matrices"

Iniciado por ZedGe, 1 Diciembre 2011, 18:12 PM

0 Miembros y 2 Visitantes están viendo este tema.

ZedGe

He Estudiado Mucho Sobre Este Tema, Se Que Se Debe usar Punteros Y Malloc

1.- Alguien Me Puede Explicar Como Crear Una Matriz Dinámica de 2 dimensiones (Filas, Columnas)
2.- Y por que se debe usar doble puntero?
3.- Debo hacer un malloc aparte para filas y columnas?


PD: ES EN PROGRAMACIÓN C

naderST

#1
2. No necesariamente se debe usar puntero a puntero, esto solo es una manera de implementarlo.

3. Con un solo malloc lo puedes hacer porque en C las matrices se representan en memoria por filas de esta manera:

1 2 3
4 5 6

En memoria sería así:

1 2 3 4 5 6

1. En el código puedes ver como se reserva una matriz dinámica sin usar puntero a puntero, como se puede tratar como una fila y bueno cualquier duda avísame se me debieron escapar muchas cosas.


#include <stdio.h>
#include <stdlib.h>
#define FILAS 2
#define COLUMNAS 3

int matriz[FILAS][COLUMNAS] = { {1,2,3}, {4,5,6}};

int * matriz_dinamica;

/*
   imprimir tratando la matriz como vector
*/
void imprimir_vector(int vector[]){
   register int i;

   for(i=0;i<FILAS*COLUMNAS;i++)
       printf("%d ", vector[i]);
   printf("\n");
}

/*
   imprimir tratando la matriz como un puntero
*/
void imprimir_puntero(int * matriz){
   register int i;

   for(i=0;i<FILAS*COLUMNAS;i++)
       printf("%d ", matriz[i]);
   printf("\n");
}

int main()
{
   register int i,j;

   imprimir_vector(matriz);
   imprimir_puntero(matriz);

   int (*ptr_matriz)[COLUMNAS];    // Apuntador a una matriz

   matriz_dinamica = (int*)malloc(sizeof(int)*FILAS*COLUMNAS);

   ptr_matriz = matriz_dinamica;

   ptr_matriz[0][0] = 1;
   ptr_matriz[0][1] = 2;
   ptr_matriz[0][2] = 3;

   ptr_matriz[1][0] = 4;
   ptr_matriz[1][1] = 5;
   ptr_matriz[1][2] = 6;

   for(i=0;i<FILAS;i++){
       for(j=0;j<COLUMNAS;j++)
           printf("%d ", ptr_matriz[i][j]);
       printf("\n");
   }

   free(matriz_dinamica);

   return 0;
}


NOTA: Para las matrices el compilador debe saber el numero de columnas de la matriz, ya que cuando usas el operador [] se resuelve de la siguiente manera:


matriz[i][j] = matriz + i * COLUMNAS + j

ZedGe

Podrías Mandar Ese Código otra vez con comentario de que hace o decirme abajo que hace cada función?

naderST

En el código en el main cuando llamas a malloc() lo que hace es reservar memoria para una matriz de enteros de tamaño FILAS*COLUMNAS, pero lo tratas como si fuera un vector porque en C las matrices se representan en memoria como vectores.

ZedGe

Tengo Este Codigo


int *arreglo;
int k, int filas, int columnas,i,j;
arreglo = (int*) malloc(filas*columnas*sizeof(int));
  for(i=0;i<=3;i++)
  {
    for(j=0;j<=3;j++)
     {
       arreglo[k] = i*columnas + j;
      }
   }


como hacer para que el arreglo sea arreglo[j] y no un arreglo de largo filas*columnas???

necesito tomarlo como una matriz

ZedGe

Es que existen 2 formas de crear un arreglo dinámico según lo k me informe:


1: Arreglo de arreglos dinámicos
2: Renglones o Columnas de orden mayor (que es lo que me mandaste)

naderST


rir3760

Se refiere a las dos formas de reservar memoria para emular una matriz.

1) El primer caso es el usual donde se reserva primero un bloque de memoria principal donde se almacenaran las direcciones en memoria del inicio de cada fila. A continuacion se reserva la memoria de cada una de ellas.

Mas o menos asi:
int **mat;
int i;

/* ... */

/* 10 filas por 20 columnas */
mat = malloc(10 * sizeof *mat);

for (i = 0; i < 10; i++)
   mat[i] = malloc(20 * sizeof *mat[i]);


2) El segundo caso ya lo explicaste (me refiero a naderST).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

ZedGe

El primer caso es Hacer Un arreglo Dinámico Dentro De otro Arreglo Dinámico, el segundo que es ese código que pusiste es pasar la matriz a un arreglo dinámico.

naderST

Googlea que hay varios ejemplos de matrices dinámicas con puntero a puntero.