Ver Mensaje Individual
  #8 (permalink)  
Antiguo 28/01/2011, 11:51
Trovaz
 
Fecha de Ingreso: octubre-2010
Ubicación: Edo. de México
Mensajes: 94
Antigüedad: 14 años, 3 meses
Puntos: 9
Respuesta: Cadenas diferentes pero me las toma como iguales

Bueno estaba esperando que alguien mas contestara pero ahi te va.

La funcion crypt efectivamente te devuelve un puntero a una cadena, pero que putero?, digamos que en ningun momento le dijimos en que puntero queriamos almacenar el resultado ni nada, entonces no tenemos el control de que puntero nos devuelve, simplemente nos devuelve uno. Entonce este es un puntero local a esa función, esto quiere decier, que cuando usas la funcion crypt, esta declara un puntero y lo mas probable es que lo declare en la primer localidad disponible que encuentre. Digamos que lo declara en la localidad 53F (por decir algo), entonces al momento de hacer su asignacion clave= crypt(...), clave obtiene como valor ese 53F O.o. PERO esa era memoria local, entonces lo que pasa es que esa memoria, al terminar la funcion crypt, vuelve a estar disponible para el sistema :o, y la segunda vez que corres crypt (sorpresa), si era memoria no se a ocupado en algun otro proceso, crypt vuelve a tomar esta localidad para depositar el resultado.

Para hacerlo un poco mas grafico digamos que yo hago algo asi.
-----------Antes del primer crypt--------------
LOCALIDAD DE MEMORIA 53F = Basura
clave = NULL (sin apuntador asociado)
clave2 = NULL
.................................................. ........................
clave = crypt(...)

---------Despues del primer crypt---------------
LOCALIDAD DE MEMORIA 53F = $1SOYUNHASH
clave = 53F
clave2 = NULL
-----------------------------------------------------------
clave2 = crypt(...)

----------Despues del segundo crypt------------------
LOCALIDAD DE MEMORIA 53F = $1SOYOTROHASH
clave = 53F
clave2 = 53F
------------------------------------------------------------------

Por lo que al hacer la comparacion, siempre (o casi siempre) te va a dar el mismo resultado. Para resolver esto lo que tienes que hacer es, en lugar de copiar el apuntador (clave = crypt()) es.

1. reservar memoria para clave y clave2 mediante malloc() o creando un arreglo de chars en lugar de un apuntador, y
2. copiar el contenido de crypt (el contenido dije) en tu clave y clave2, mediante un strcpy()

Asi veras que corre tu codigo perfectamente ^^

Espero haber sido de ayuda.
Saludos ++