Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: PeKiN en 29 Mayo 2011, 23:38 pm



Título: lapsus con punteros
Publicado por: PeKiN en 29 Mayo 2011, 23:38 pm
Hola! he tenido un problema muy básico con punteros y me gustaría que alguien me ilustrara práctica y teóricamente para quitarme las dudas.

Una función pedía como argumento un puntero y yo hice lo siguiente:

Código:
int *a;
funcion(a);

Y me daba violación de segmento.

Sin embargo, luego lo puse así:

Código:
int a;
funcion(&a);

Y ya funcionaba correctamente. Entiendo que el puntero, al declararlo, no apunte a nada y por eso al llamar la función no puede escribir nada. En el segundo caso, al declarar la variable, sí que reservo un espacio de memoria cuya direccion al obtenerla "&a" es como si fuera su propio puntero, apuntando a un destino ya existente, por eso puede escribir la función en esa variable y no hay error.
¿Es esto así?

Gracias de ante mano.


Título: Re: lapsus con punteros
Publicado por: Akai en 29 Mayo 2011, 23:47 pm
Tu problema está en que si haces lo primero, el puntero apunta a dios sabe donde (en el mejor caso, si tu compilador inicializa las variables a 0, a NULL).

Entonces, la violación de segmento se produce por el hecho de que el trabajo que haga la función lo hace sobre un puntero que está señalando a la dirección de memoria NULL o a una zona que no es tuya.

En ese caso, el Sistema Operativo, te mata.

En el segundo caso no ocurre por tratarse de obtener la dirección de memoria del entero "a".

Para que el primer caso funcionase, debería ser algo así:

Código
  1. int *a;
  2. int b;
  3.  
  4. *a=b;
  5.  
  6. funcion(a);
  7.  


Título: Re: lapsus con punteros
Publicado por: PeKiN en 30 Mayo 2011, 00:01 am
Gracias por tu respuesta Akai, ahora bien, la diferencia esencial entre el código que me pusiste y este otro, ¿cual sería?

Código:
int *a;
int b;
 
a=b;
 
funcion(a);



Título: Re: lapsus con punteros
Publicado por: Akai en 30 Mayo 2011, 00:21 am
Que tu código intenta igualar un entero y un puntero a entero, lo cual no es correcto porque no son tipos que se puedan convertir de uno a otro directamente,

Otra opción sería:

Código
  1. a=&b

En cualquier caso, y de una forma u otra, "a" debe recibir la dirección de memoria de "b".


Título: Re: lapsus con punteros
Publicado por: PeKiN en 30 Mayo 2011, 01:16 am
Gracias Akai, perfecto, ya lo pillo.

Es que tenía entendido que el operador asterisco delante de una variable de tipo puntero, era para obtener "el contenido de", por tanto, en
Código:
*a=b;

lo veía como, el contenido de la dirección a la que apunta 'a' (que en principio no apunta a nada) le asigno el valor o contenido de 'b', y al no apuntar a nada aún esa 'a'..  :xD


Título: Re: lapsus con punteros
Publicado por: Akai en 30 Mayo 2011, 01:44 am
Si y no, * implica lo apuntado por, entonces *a es lo apuntado por a. si haces *a=b, lo apuntado por a, es igual a b, y dado que a es un puntero al tipo de b, a apunta a b.

La otra forma es a=&b, es decir, en a almacenas la dirección de memoria de b, y lo mismo, como a es un puntero al tipo de b, apunta a b,