matrices y memoria dinamica

Iniciado por m@o_614, 22 Noviembre 2013, 23:13 PM

0 Miembros y 1 Visitante están viendo este tema.

m@o_614

Saludos

si tengo  una matriz n x n, a la que quiero asignarle memoria dinamicamente porque su tamaño solo se puede saber en tiempo de ejecucion, cual es la manera correcta de hacerlo?

char **tablero;
     tablero = (char**)malloc(tamanio*sizeof(char*);


o esta otra:


char **tablero;
tablero = (char**)malloc(n*sizeof(char));
   for(i = 0;i < n;i++)
      tablero[i] = (char*)malloc(n*sizeof(char));


otra duda, estaba leyendo un manual sobre memoria dinamica y me decia que si hacia algo como esto me iba a dar error de compilacion que porque el compilador requiere que el tamaño del array o de la matriz sea constante:

int main()
{

    int num_estudiantes,i;
    printf("Dame numero de estudiantes: ");
    scanf("%d",&num_estudiantes);
    int asignatura[num_estudiantes];
    for(i = 0;i < num_estudiantes;i++)
    {
        printf("Dame un numero \n");
        scanf("%d",&asignatura[i]);
    }

pero ya lo probe y me compila correctamente, a que se debe esto??

gracias

rir3760

Cuando tengas una duda por favor indica el lenguaje de programación.

Cita de: m@o_614 en 22 Noviembre 2013, 23:13 PM
si tengo  una matriz n x n, a la que quiero asignarle memoria dinamicamente porque su tamaño solo se puede saber en tiempo de ejecucion, cual es la manera correcta de hacerlo?
La segunda. Dos detalles a considerar son 1) en C no es necesaria la conversión explicita y 2) en C y C++ no es necesario utilizar "sizeof(char)" ya que este siempre es igual a uno.

Cita de: m@o_614 en 22 Noviembre 2013, 23:13 PMotra duda, estaba leyendo un manual sobre memoria dinamica y me decia que si hacia algo como esto me iba a dar error de compilacion que porque el compilador requiere que el tamaño del array o de la matriz sea constante

[...]

pero ya lo probe y me compila correctamente, a que se debe esto??
* En C++ no es valido.
* En C depende del modo de compilación: C90 no lo soporta, C99 si (array de longitud variable o VLA) y C11 también lo soporta pero como una característica opcional.

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

m@o_614

muchas gracias rir3760, con respecto a sizeof(char), o sizeof(int) o el tipo que sea, me he fijado que cuando le asignan dinamicamente memoria en algunos casos lo ponen como:

int main()
{
   char **tablero;
   tablero = (char**)malloc(n*sizeof(char*));
   return 0;
}
indicando que es un puntero a char en el sizeof, y en otros casos lo ponen as,(suponiendo que ahora la variable es de tipo int):

variable = (int**) malloc(n*sizeof(int));

por que en algunas ocasiones lo ponen como puntero y en otras no

rir3760

De nuevo: cuando tengas una duda por favor indica el lenguaje de programación.

¿Modificaste el segundo fragmento de tu primer mensaje?

En C para implementar una matriz el idioma es:
T **mat;

/* ... */

mat = malloc(NUM_FILAS * sizeof *mat);
for (i = 0; i < NUM_FILAS; i++)
   mat[i] = malloc(NUM_COLS * sizeof *mat[i]);

Donde "T" es el tipo de los elementos de la matriz, la ventaja de esta forma es no tener que indicar el tipo apuntado al reservar memoria.

Cita de: m@o_614 en 23 Noviembre 2013, 06:32 AMpor que en algunas ocasiones lo ponen como puntero y en otras no
Porque depende del programa, cuando se reserva memoria siempre se utiliza el operador sizeof con el tipo del objeto apuntado, por ejemplo:
/* Ejemplo 1: el tipo apuntado es *p == int */
int *p;

p = malloc(ALGUN_VALOR * sizeof *p);

/* Ejemplo 2: el tipo apuntado es *q == int (*[10])(void) */
int (*(*q)[10])(void);

q = malloc(ALGUN_VALOR * sizeof *q);


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