Discussion:
malloc
(demasiado antiguo para responder)
Showtime
2003-11-03 20:15:47 UTC
Permalink
Hola. Según he leído en varios sitios, la memoria asignada por "malloc" no
es local a la función en la que se encuentra, sino que permanece fuera de
ella. Sin embargo, esto no funciona:

//-----------------------
void funcion (int *p) {
p=malloc(sizeof(int)*3);
*p=1;
*(p+1)=2;
*(p+2)=3;
}

void main () {
int *p;
funcion(p);
printf("%i %i %i\n",*p,*(p+1),*(p+2)); //valores erróneos
free(p);
}
//-----------------------

Pero esto sí:

//-----------------------
void funcion (int *p) {
*p=1;
}

void main () {
int p;
funcion(&p);
printf("%i\n",p); //valor correcto
}
//-----------------------


¿A qué se debe esto?

Gracias de antemano.
Julián Albo
2003-11-03 20:26:47 UTC
Permalink
Post by Showtime
//-----------------------
void funcion (int *p) {
*p=1;
}
void main () {
int p;
funcion(&p);
printf("%i\n",p); //valor correcto
}
//-----------------------
¿A qué se debe esto?
Para modificar un int pasas un puntero a un int. Pues para modificar un
puntero a un int debes pasar un puntero a un puntero a un int.

O para no complicarte sin necesidad, haz que la función devuelva un
puntero y listo.

Salu2
Showtime
2003-11-03 22:49:02 UTC
Permalink
Hola, muchas gracias por tu respuesta.

"Juli�n Albo" <***@terra.es> escribi� en el mensaje news:***@terra.es...
Showtime escribió:
...
Post by Julián Albo
Para modificar un int pasas un puntero a un int. Pues para modificar un
puntero a un int debes pasar un puntero a un puntero a un int.
Creo que lo he entendido, pero por si acaso, índicame por favor si lo
siguiente es correcto (lo he compilado y funciona pero no sé si estoy
haciendo algo superfluo o lo he enrevesado más de lo necesario):

//--------------------
void funcion (int **p) {
*p=malloc(sizeof(int *)*3);
**p=1;
*(*p+1)=2;
*(*p+2)=3;
}

void main () {
int **p;
funcion(p);
printf("%i %i %i\n",**p,*(*p+1),*(*p+2));
}
//--------------------
Post by Julián Albo
O para no complicarte sin necesidad, haz que la función devuelva un
puntero y listo.
Las funciones que puse eran un ejemplo simplificado, en realidad la función
ya devuelve otro valor distinto (un entero), pero también necesitaba que
devolviese un vector pero asignando memoria dinámicamente dentro de la
propia función (¿es mala programación esto, por cierto?).

saludos y gracias de nuevo
Julián Albo
2003-11-03 23:08:27 UTC
Permalink
Post by Showtime
Creo que lo he entendido, pero por si acaso, índicame por favor si lo
siguiente es correcto (lo he compilado y funciona pero no sé si estoy
//--------------------
void funcion (int **p) {
*p=malloc(sizeof(int *)*3);
**p=1;
*(*p+1)=2;
*(*p+2)=3;
}
void main () {
int **p;
funcion(p);
printf("%i %i %i\n",**p,*(*p+1),*(*p+2));
}
//--------------------
Esto no es correcto, por que p no apunta a ninguna parte, lo que haces
que apunte a algún sitio es lo apuntado por p, no el propio p. Y la cosa
es más sencilla:

int * p;
funcion (& p);
printf ("%i %i %i\n", * p, * (p + 1), * (p +2) );

Si funcionaba es por que casualmente p apuntaría a una zona de la
memoria en la que puedes escribir. En un programa grande eso causaría
errores impredecibles.
Post by Showtime
Las funciones que puse eran un ejemplo simplificado, en realidad la función
ya devuelve otro valor distinto (un entero), pero también necesitaba que
devolviese un vector pero asignando memoria dinámicamente dentro de la
propia función (¿es mala programación esto, por cierto?).
No es malo, pero te obliga a usar punteros a punteros y, por tanto, a
ser muy cuidadoso con lo que haces ya que cuantos más punteros entran en
juego más fácil es liarse.

Quizá fuera mejor devolver el puntero como valor de la función, y el
entero mediante puntero. La cantidad de punteros sería la misma, pero la
complejidad menor.

Salu2

Loading...