elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
27 Mayo 2012, 08:24  


Tema destacado: Personaliza-Escoge el diseño del foro que más te guste.

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  una funcion no es capaz de modificar el valor apuntado de un puntero ?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: una funcion no es capaz de modificar el valor apuntado de un puntero ?  (Leído 1,365 veces)
darkxxx

Desconectado Desconectado

Mensajes: 85


Ver Perfil
una funcion no es capaz de modificar el valor apuntado de un puntero ?
« en: 9 Abril 2009, 09:57 »

bueno resulta que estoy en la etapa de estudio de lista, pila y cola pero en medio  del tema me doy cuenta que el conocimiento que tenia sobre los punteros no era suficiente y hace que me tranque al tratar de aprender sobre esas estructuras de dato, ahora la duda que tengo es la siguiente:

tengo un puntero (A) en la funcion principal que al principio lo hago apuntar a NULL ahora al llamar a una funcion le paso como argumento el puntero (A) para que la funcion modifique el valor apuntado por el puntero (A) pero resulta que despues de que cambio el valor apuntado por el puntero (A) y termina de ejecutarse el llamado a la funcion cuando reviso el valor apuntado por el puntero (A) resulta que sigue apuntando a NULL es decir que no modifico el valor apuntado por el puntero original


Funcion Principal en donde creo el puntero VALOR y le paso el valor apuntado originalmente a NULL a la funcion noHaceNada


Código:
#include <stdio.h>
#include <stdlib.h>

void noHaceNada(int*);

int main() {
    int *valor;
   
    valor = NULL;
   
    printf("(main) valor --> %#x\n",valor);
   
    noHaceNada(valor);
   
    printf("(main) valor --> %#x\n",valor);
   
    system("pause");
 return 0;   
}

luego en la funcion hago que la funcion ptr apunte a donde apunta temp que seria la direccion de memoria en donde se reservo memoria para el elemento int

Código:
void noHaceNada(int *ptr) {
          int *temp;
              temp = (int*) malloc(sizeof(int));
             
          printf("(function) temp --> %#x\n",temp);
          printf("(ptr) ptr --> %#x\n",ptr);
         
          ptr = temp;
         
          printf("(function) ptr --> %#x\n",ptr);
}

pero resulta que al acabar el llamado a la funcion la variable valor sigue apuntando a NULL y esa es mi duda porque sigue apuntando a NULL si en la funcion le digo que apunte a donde apunta temp

saludos


« Última modificación: 9 Abril 2009, 10:00 por darkxxx » En línea
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.389


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: una funcion no es capaz de modificar el valor apuntado de un puntero ?
« Respuesta #1 en: 9 Abril 2009, 10:10 »

Sin entrar en grandes detalles a noHaceNada le pasas una direccion de memoria, NULL, mas no la direccion de memoria de la variable valor, por lo tanto dentro de esa funcion ptr es una variable local que apunta a NULL. Si queres modificar la direccion a la que apunta valor tenes que usar un doble puntero (**) o un puntero a referencia (*&, C++).


« Última modificación: 9 Abril 2009, 10:14 por Eternal Idol » En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Ragnarok
Colaborador
***
Desconectado Desconectado

Mensajes: 4.561


Shrödingerificado


Ver Perfil
Re: una funcion no es capaz de modificar el valor apuntado de un puntero ?
« Respuesta #2 en: 9 Abril 2009, 11:15 »

En las funciones de C no se puede modificar el valor de las variables, por eso se usan los punteros, pero no se usan así. No modificas la dirección a la que apunta el puntero, sino la información que hay en esa dirección. Así:

Código
#include <stdio.h>
#include <stdlib.h>
 
int haceAlgo(int *n){
 *n += 2;
 return 0;
}
 
int main (){
 int *modificable = malloc(sizeof(int));
 *modificable = 0;
 haceAlgo(modificable);
 printf("%d\n", *modificable);
 return 0;
}

Sin embargo, como ves, en "main" no se ve la modificación que se hace a "modificable", puesto que se hace en otra función que podría estar en otro fichero e incluso no tener disponible el código fuente. Por eso es mejor usar los retornos de las funciones cuando sea posible. Este ejemplo que he puesto es de juguete y por eso es posible. Sería así:

Código
#include <stdio.h>
 
int haceAlgo(int n){
 return n+2;
}
 
int main (){
 int modificable = 0;
 modificable = haceAlgo(modificable);
 printf("%d\n", modificable);
 return 0;
}

Sigue leyendo acerca de punteros y verás que todo tiene sentido.
En línea

No olvidéis leer las normas generales, además de las específicas de cada tablón.sgae, ladrones
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.389


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: una funcion no es capaz de modificar el valor apuntado de un puntero ?
« Respuesta #3 en: 9 Abril 2009, 11:27 »

Ragnarok: la modificacion que haces si se ve (es diferente claro) ... y que la funcion este en otro archivo o no tengas el codigo fuente es irrelevante. Que no puedas modificar la direccion a la que apunta la variable modificable se debe a una sola razon: en tu funcion haceAlgo n es una copia local de modificable que obviamente no tiene la misma direccion sino el mismo contenido (ambas variables apuntan a la memoria reservada con malloc en main).


Agrego el codigo original funcionando como darkxxx queria:
Código
#include <stdio.h>
#include <stdlib.h>
 
void noHaceNada(int **);
 
int main() {
   int *valor;
 
   valor = NULL;
 
   printf("(main) valor --> %#x\n",valor);
 
   noHaceNada(&valor);
 
   printf("(main) valor --> %#x\n",valor);
 
   system("pause");
return 0;  
}
 
void noHaceNada(int **ptr) {
         int *temp;
             temp = (int*) malloc(sizeof(int));
 
         printf("(function) temp --> %#x\n",temp);
         printf("(ptr) *ptr --> %#x\n",*ptr);
 
         *ptr = temp;
 
         printf("(function) *ptr --> %#x\n",*ptr);
}
« Última modificación: 9 Abril 2009, 11:38 por Eternal Idol » En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Ragnarok
Colaborador
***
Desconectado Desconectado

Mensajes: 4.561


Shrödingerificado


Ver Perfil
Re: una funcion no es capaz de modificar el valor apuntado de un puntero ?
« Respuesta #4 en: 9 Abril 2009, 12:17 »

Con que no se ve quiero decir que el programador no lo ve, hace el código un poco más oscuro, por eso es mejor usar el retorno de la función y no modificar los parámetros que se le pasan cuando sea posible. A veces esto no es suficiente y hay que recurrir a punteros o parámetros por referencia, y es algo que hay que usar, pero no hay que abusar de ello.

En un mundo ideal en que el código está bien documentado y la gente mira la documentación no habría problema, pero en el mundo real un programador puede perder muchas horas antes de descubrir que hay una función que le está modificando una variable y la forma en que la modifica.

Simplemente, aprovechando que se ha preguntado esto he decidido acotar el alcance de la respuesta, porque al que tiene un martillo todo le parecen clavos.

Por otro lado, creo que con los ejemplos que he puesto sería suficiente para que darkxxx pudiera extrapolar al suyo, pero sólo es mi opinión.
En línea

No olvidéis leer las normas generales, además de las específicas de cada tablón.sgae, ladrones
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.389


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: una funcion no es capaz de modificar el valor apuntado de un puntero ?
« Respuesta #5 en: 9 Abril 2009, 12:39 »

Con que no se ve quiero decir que el programador no lo ve, hace el código un poco más oscuro, por eso es mejor usar el retorno de la función y no modificar los parámetros que se le pasan cuando sea posible.

Es cierto aunque si pasamos la direccion de la variable es de esperar que sea por alguna razon en particular, tambien podemos usar const para indicar lo contrario.

Simplemente, aprovechando que se ha preguntado esto he decidido acotar el alcance de la respuesta, porque al que tiene un martillo todo le parecen clavos.

Efectivamente hay que saber usar el martillo o cualquiera de las herramientas que uno tiene disponibles para resolver un problema.

Por otro lado, creo que con los ejemplos que he puesto sería suficiente para que darkxxx pudiera extrapolar al suyo, pero sólo es mi opinión.

No me parece pero por supuesto tambien es mi opinion unicamente.
En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Obtener puntero de funcion dentro de un form o class. « 1 2 »
Programación Visual Basic
F3B14N 24 2,170 Último mensaje 9 Mayo 2011, 05:52
por BlackZeroX (Astaroth)
puntero a funcion
Programación C/C++
kondrag_X1 2 933 Último mensaje 30 Abril 2011, 19:49
por Leo Gutiérrez.
puntero de una funcion con dos parametros.
Programación Visual Basic
LeandroA 1 351 Último mensaje 12 Septiembre 2011, 00:34
por Karcrack
Funcion y puntero
Programación C/C++
gonzalo_C 2 295 Último mensaje 9 Febrero 2012, 17:01
por gonzalo_C
F1 - Problema con puntero a Función C#
.NET
Maurice_Lupin 0 58 Último mensaje 17 Mayo 2012, 16:14
por Maurice_Lupin
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines