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
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
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
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