elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  lapsus con punteros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: lapsus con punteros  (Leído 2,483 veces)
PeKiN

Desconectado Desconectado

Mensajes: 13


Ver Perfil
lapsus con punteros
« 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.


« Última modificación: 30 Mayo 2011, 01:17 am por PeKiN » En línea

Akai


Desconectado Desconectado

Mensajes: 823



Ver Perfil
Re: lapsus con punteros
« Respuesta #1 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.  


En línea

PeKiN

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: lapsus con punteros
« Respuesta #2 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);

En línea

Akai


Desconectado Desconectado

Mensajes: 823



Ver Perfil
Re: lapsus con punteros
« Respuesta #3 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".
En línea

PeKiN

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: lapsus con punteros
« Respuesta #4 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
En línea

Akai


Desconectado Desconectado

Mensajes: 823



Ver Perfil
Re: lapsus con punteros
« Respuesta #5 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,
« Última modificación: 30 Mayo 2011, 01:50 am por Akai » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
punteros
Programación Visual Basic
bautistasbr 4 2,101 Último mensaje 30 Septiembre 2005, 19:35 pm
por NYlOn
Canal de Telegram Lapsus: datos privados de nvidia y Samsung
Seguridad
el-brujo 2 4,450 Último mensaje 7 Marzo 2022, 12:55 pm
por el-brujo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines