Ver Mensaje Individual
  #2 (permalink)  
Antiguo 26/05/2015, 08:00
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Problema con estructuras y punteros en C

Si yo te pongo este ejemplo:

Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. void func( int dato )
  4. {
  5.   dato = 5;
  6. }
  7.  
  8. int main( int, char**)
  9. {
  10.   int variable = 0;
  11.   func( variable );
  12.  
  13.   printf( "%d", variable );
  14.   return 0;
  15. }

¿Qué se imprimirá por pantalla?
  • Un número indeterminado
  • 5
  • 0

La respuesta correcta, espero que coincidas conmigo, es la tercera. El motivo es que "dato" es una copia local de "variable", por lo que cualquier cambio en "dato" no tendrá efecto en el valor de "variable".

Si trabajamos con punteros pasa algo parecido:

Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. void func( int* dato )
  4. {
  5.   dato = (int*)5; // Suponemos que '5' es una dirección de memoria válida
  6. }
  7.  
  8. int main( int, char**)
  9. {
  10.   int* variable = 0;
  11.   func( variable );
  12.  
  13.   printf( "%d", variable );
  14.   return 0;
  15. }

En este caso vemos que, efectivamente, el programa vuelve a devolver 0.

Espera, ¿no se supone que una de las gracias que tiene usar punteros es que podemos modificar los valores "a distancia"? Si, cierto, pero con un pequeño matiz:

"dato" es una variable local. Es un puntero, no lo niego, pero es una variable local. Al ser un puntero, si modificamos los valores almacenados en "dato" veremos que efectivamente también van a cambiar en "variable"... sin embargo, si cambiamos la dirección de memoria apuntada por "dato", estamos cambiando un valor local de "func", por lo que dicho cambio no se verá reflejado fuera de dicha función. No se si me explico.

Al final la cosa se soluciona añadiendo más punteros, tal y como se indica a continuación:
  • Para modificar una variable normal desde una función, necesitamos un puntero
  • Para modificar la posición de memoria a la que apunta un puntero desde una función, necesitamos un puntero doble
  • Para modificar la posición de memoria a la que apunta un puntero doble desde una función, necesitamos un puntero triple
  • ...

Es decir:

Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. void func( int** dato )
  4. {
  5.   *dato = (int*)5; // Suponemos que '5' es una dirección de memoria válida
  6. }
  7.  
  8. int main( int, char**)
  9. {
  10.   int* variable = 0;
  11.   func( &variable );
  12.  
  13.   printf( "%d", variable ); // Imprime 5, como pretendíamos
  14.   return 0;
  15. }

Un saludo