c: funcion que retorne una direccion de memoria

O

Wenas, ando haciendo una aplicacion en ansi c, y en una de las funciones hago un malloc, y me gustaria que la direccion de memoria de la reserva de datos del malloc, estuviera disponible para que pueda ser usada por otras funciones.

Ahora lo que hecho ha sido usar unos punteros globales para que su direccion estuviera disponible para el resto de funciones, pero mi pregunta es como puedo hacer quela funcion retorne la direccion de memoria del malloc pero sin usar el return. Espero q se pille lo q quiero hacer, un saludo.

Pd:

este es parte del codigo

simulando = (float ) malloc((t_simulacion+1)sizeof(float));

lo que quiero es retornar el puntero simulando al main, pero sin usar el return, ya que el return lo uso para dar un error en la funcion.

Poisonous

pasar 1 puntero por referencia y luego lo igualas a la direccion esa?

O

#2 mmm eso mismo,sabes como se hace?

Con variables normales se hacerlo, pero con punteros me lio un poco. gracias por responder tan rapido

Poisonous

es que no programo en c, solo conozco c++.

pero vamos añades 1 nuevo parametro a la cabecera d la funcion, lo pasas por referencia (&puntero o lo que sea) e igualas puntero a lo que retornaria la funcion si no devolviese el error ese que comentas.

luego a la hora d llamar a la funcion pues tienes que crearte 1 nueva variable que es la que contendra la direccion de memoria que buscas.

LOc0

Usando un puntero doble.

Ejemplo:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void reserva_memoria(char **);

int main(int argc, char **argv)
{
char *puntero2 = NULL;


reserva_memoria(&puntero2);

strcpy(puntero2, "Hola mundo\n");

printf("%s", puntero2);

free(puntero2);

return 0;

}

void reserva_memoria(char **puntero1)
{
*puntero1 = malloc(20);


}
[/i]

Salu2 ;)

O

thx LOc0, funciona :D

javithelong

La teoría de esto es: (la práctica esta ahi arriba)

Cuando llamas a una función, todos los parámetros de la misma se guardan en una pila de datos que tiene el programa en ejecución (que esta en el segmento de datos asignado por el SO al programa).

Estos parámetros, se recuperan en sus variables al hacer un return.

Si modificas por tanto una variable que se ha copiado en la pila (como deciamos antes) al retornar de la función se restaurará el valor anterior.

Por tanto, para modificar un valor de una variable en una función, una de las posibilidades es pasarle una referencia (la dirección de memoria) de la variable. De esta manera, será la dirección de memoria (y no el valor) lo que se copie en la pila, y lo que se restaurará. Ningún problema, ya que nosotros hemos modificado el contenido, no la dirección.

Esto es aplicable recursivamente, quiero decir. Para modificar un puntero (es decir, la dirección de memoria donde apunta ese puntero) tendremos que pasar la dirección de memoria de ese puntero (su referencia), por tanto, un puntero doble. Y así sucesivamente con cosas de más dimensiones.

Espero que os leais esto, porque de las ultimas dudas por aquí puestas, todas tienen que ver con esto (programas que no funcionan, y demás...).

Un saludo

O

#7 gracias por la explicacion, me ha aclarado el pequeño lio q tenia.

Y otrapregunta, no tiene q ver con esto pero prefiero no abrir un post para una cosa un poco tonta.

Vereis mi programa tiene q ser ejecutable en linux (bajo gcc) y en windows, en algunas partes del codigo hago un limpiar pantalla con una llamada al sistema, pero como ya sabreis la llamada al sistema para limpiar la pantalla es distinta en linux q en windows, por lo tanto me he hecho unos defines, aqui os los pongo:

#ifdef WIN32

#define clearsc(); system("cls");
#endif

#ifdef GNUC
#define clearsc(); system ("clear");
#endif

He cogido unas palabras reservadas de los compiladores, para hacer el define (win32 y GNUC), y mi pregunta es si win32 no va a estar en gcc (supongo q no) y si GNUC, es una palbra reservada de gcc. Un saludo a todos.

Soltrac

#8 para el "gcc de windows", usa cygwin, que lo que hace es emular las apis de linux en windows.

www.cygwin.com <- échale un vistazo, espero que te sirva.

Aunque realmente no se si es esto lo que pedías :P

O

#8 gracias por responder, pero en realidad lo q necesito es una palabra reservada del compilador gcc y que no vaya a estar ya definida en visual c.

Por ejemplo en visual creo q win32 me vale, ya que esa palabra no va a estar reservada en un gcc q este instalado en linux.

javithelong

Creo que en conio.h (que no es standard, pero la tienen casi todos los compiladores) había un clrscr();

Otra forma de hacerlo, es haciendo unos cuantos printf("\n");

Y otra manera, simplemente, es no hacerlo, casi nunca es necesario borrar la pantalla...

En cuanto a esos defines, ni idea, no se qué puedes probar, hazte un main pequeñito, y prueba, en plan:

if (PALABRAAPROBAR) printf ("%d\n", PALABRAAPROBAR);

No se... xD

Usuarios habituales