lapsus con punteros

Iniciado por PeKiN, 29 Mayo 2011, 23:38 PM

0 Miembros y 1 Visitante están viendo este tema.

PeKiN

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:

int *a;
funcion(a);


Y me daba violación de segmento.

Sin embargo, luego lo puse así:

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.

Akai

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í:


int *a;
int b;

*a=b;

funcion(a);

PeKiN

Gracias por tu respuesta Akai, ahora bien, la diferencia esencial entre el código que me pusiste y este otro, ¿cual sería?


int *a;
int b;

a=b;

funcion(a);



Akai

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:

a=&b

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

PeKiN

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

*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

Akai

#5
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,