Discussion:
Funcion para reservar memoria dinamica a un array multidimensional...
(demasiado antiguo para responder)
kachorro
2005-04-20 13:08:57 UTC
Permalink
Hola buenas a todos

Haciendo un programa me surgio la necesidad de crear varias matrices
bidimensionales y asignarles un tamaño.

Yo lo hago de esta forma:
int **p=0;
if (p=(int**) malloc (nR * sizeof(int *))){
int i;
for (i=0; i<nC; i++){
if (!(p[i]=(int *) malloc (nC * sizeof (int)))){
return (-1);
}//rel: p[i] es un puntero dinamico de nC enteros
}
}else{
//algo +
}

Esta forma me funciona desde el main pero si intento usarla desde una
funcion produce un Segmentation fault...

Como puedo crear una funcion para asignar memoria dinamica a arrays
multidimensionales ???

Un saludo Kachorro
Alberto Giménez
2005-04-20 15:52:13 UTC
Permalink
Post by kachorro
Hola buenas a todos
Haciendo un programa me surgio la necesidad de crear varias matrices
bidimensionales y asignarles un tamaño.
#include <stdlib.h> /* necesario para malloc */
Post by kachorro
int **p=0;
if (p=(int**) malloc (nR * sizeof(int *))){
El cast es innecesario e incluso peligroso. Oculta el posible error de
no incuír la cabecera donde se declara malloc. También puedes hacer esta
sentencia "tipo-independiente", para ahorrarte el int* del sizeof y
asegurarte que siempre reservarás memoria para el tipo adecuado:

if (p = malloc (nR * sizeof *p)){
Post by kachorro
int i;
for (i=0; i<nC; i++){
¿En este for no querrás decir i < nR? Recuerda que en el anterior malloc
has reservado nR punteros, no nC.
Post by kachorro
if (!(p[i]=(int *) malloc (nC * sizeof (int)))){
Algo similar en lo que respecta a malloc:

if (!(p[i] = malloc (nC * sizeof *p[i]){ /* o sizeof **p */
Post by kachorro
return (-1);
oops, malloc falló... ¿No devolvemos la memoria de los i-ésimos mallocs
anteriores (mas el inicial para p)?
Post by kachorro
}//rel: p[i] es un puntero dinamico de nC enteros
p[i] es un puntero a entero, no un puntero dinámico de N enteros. Otra
cosa es que gracias a los punteros puedas utilizar p[i] como un array de
denteros, pero *en principio* es un puntero a entero.
Post by kachorro
}
}else{
//algo +
}
Esta forma me funciona desde el main pero si intento usarla desde una
funcion produce un Segmentation fault...
Creo que el fallo está en la condición del for (i < nC)
Post by kachorro
Como puedo crear una funcion para asignar memoria dinamica a arrays
multidimensionales ???
int **crear_matriz2(int rows, int cols)
{
int **matriz;

/* código */

return matriz;
}

está claro, no??? XD

Saludos.
--
Luis Alberto Giménez
JabberID: ***@bulmalug.net
GnuPG ID: 0x3BAABDE1
kachorro
2005-04-23 10:24:47 UTC
Permalink
Muchas gracias por la info, y las correcciones :).

Otra pregunta y si quiero pasar en :
int **crear_matriz2(int rows, int cols)
{
int **matriz;

/* código */

return matriz;
}
la matriz por referencia ???
int crear_matriz2(int ***matriz, int rows, int cols)
llamandola crear_matriz2 (&m, r, c)
asi tragaria ?
Post by Alberto Giménez
Post by kachorro
Hola buenas a todos
Haciendo un programa me surgio la necesidad de crear varias matrices
bidimensionales y asignarles un tamaño.
#include <stdlib.h> /* necesario para malloc */
Post by kachorro
int **p=0;
if (p=(int**) malloc (nR * sizeof(int *))){
El cast es innecesario e incluso peligroso. Oculta el posible error de
no incuír la cabecera donde se declara malloc. También puedes hacer esta
sentencia "tipo-independiente", para ahorrarte el int* del sizeof y
if (p = malloc (nR * sizeof *p)){
Post by kachorro
int i;
for (i=0; i<nC; i++){
¿En este for no querrás decir i < nR? Recuerda que en el anterior malloc
has reservado nR punteros, no nC.
Post by kachorro
if (!(p[i]=(int *) malloc (nC * sizeof (int)))){
if (!(p[i] = malloc (nC * sizeof *p[i]){ /* o sizeof **p */
Post by kachorro
return (-1);
oops, malloc falló... ¿No devolvemos la memoria de los i-ésimos mallocs
anteriores (mas el inicial para p)?
Post by kachorro
}//rel: p[i] es un puntero dinamico de nC enteros
p[i] es un puntero a entero, no un puntero dinámico de N enteros. Otra
cosa es que gracias a los punteros puedas utilizar p[i] como un array de
denteros, pero *en principio* es un puntero a entero.
Post by kachorro
}
}else{
//algo +
}
Esta forma me funciona desde el main pero si intento usarla desde una
funcion produce un Segmentation fault...
Creo que el fallo está en la condición del for (i < nC)
Post by kachorro
Como puedo crear una funcion para asignar memoria dinamica a arrays
multidimensionales ???
int **crear_matriz2(int rows, int cols)
{
int **matriz;
/* código */
return matriz;
}
está claro, no??? XD
Saludos.
Alberto Giménez
2005-04-24 10:58:14 UTC
Permalink
Post by kachorro
int crear_matriz2(int ***matriz, int rows, int cols)
llamandola crear_matriz2 (&m, r, c)
asi tragaria ?
Sí, claro, pero yo veo más elegante que cuando una función hace un
malloc, devuelva la memoria como valor de retorno (gusto personal).
Además, el valor inicial de m lo pierdes, con lo que no tiene sentido
"pasárselo" a la función.

Por supuesto, para gustos modos de indentar ;)
Saludos.
--
Luis Alberto Giménez
JabberID: ***@bulmalug.net
GnuPG ID: 0x3BAABDE1
kachorro
2005-04-24 20:40:08 UTC
Permalink
ok muchas gracias....

Un saludo
Kachorro

Loading...