Agenda en C con malloc

ReBeNTuk0

Buenas, tengo creada una pequeña agenda en C y me funciona correctamente, pero a la hora de ponerla con memoria dinamica y usar malloc y cambiando la definicion de la estructuras de struct nombre nombre[MAX] por struct nombre *nombre, me ha dejado de funcionar. Despues de usar la funcion introducir() al listar con la funcion listar() da un error. Espero que me podais ayudar, gracias. http://rafb.net/p/xjpel330.html

LOc0

Vale, cambia en todas las funciones fread y fwrite el primer parámetro &contactos por contactos. Con eso ya te debería funcionar bien.

Salu2 ;)

ReBeNTuk0

Me funciona casi todo asi! Cuando le doy a eliminar contactos se me sale del programa pero no da ningun error, simplemente se sale. Por cierto, ¿por que es sin el &? Gracias!

LOc0

Es sin el & porque contactos es un puntero. Si le pones el & estás mandando la dirección de memoria de un puntero ("puntero doble").

Y revisa la función eliminar, porque no está bien. ¿Cuándo reservas memoria para auxiliar?

Salu2 ;)

PD: por cierto, OLVIDA lo que te dije de realloc. Era otra de mis paranoias...

maRc

Porque al fread tienes que pasarle la dirección de memoria donde vas a guardar lo que leas, y tus contactos es un puntero (una dirección de memoria).

El & hace que te refieras a la dirección donde está la estructura, no a la estructura en si.

ReBeNTuk0

Me sigue sin funcionar la funcion. Lo primero que he hecho ha sido quitarle el & a auxiliar, dejandolo asi:

fichero=fopen("agendita.dat","wb");
auxiliar=(struct agenda *)malloc(total-1 * sizeof(struct agenda));
fwrite(auxiliar, sizeof(struct agenda),total-1,fichero);
fclose(fichero);
printf ("\nContacto borrado correctamente...\n\n");

Sigue igual, y no da error pero se sale del programa. Si pongo el auxiliar=(struct agenda *)malloc(total-1 * sizeof(struct agenda)); arriba junto al malloc de contactos, si peta el programa.

Sin usar memoria dinamica, funciona perfectamente, pero el malloc estara haciendo cosas malas por ahi :s

Incluso sin reservarle memoria a auxiliar, como si no fuera dinamica, tambien peta :S

LOc0

Tienes que reservar memoria con malloc() para auxiliar ANTES de ponerte a copiar todas las estructuras (menos la que vas a eliminar). Ahora mismo reservas justo antes de escribir auxiliar al fichero, lo cual no tiene sentido.

Para auxiliar reserva la misma cantidad que para contactos, ya que si buscas un nombre que no está tendrás que copiar en auxiliar todos.

Salu2 ;)

ReBeNTuk0

Ya me funcionaaaaaaa!!!! Un billon de gracias LOc0, me has salvado la vida para el examen de mañana!!!

dagavi

Puedes poner el código completo corregido?

Es que aunque mas o menos manejo con C++ (es lo que me están enseñando más a fondo en la uni) me gustaría ir viendo un poco de C también (que damos, pero para cosas muy simples y que no tienen diferencia alguna con C++), y hoy (al ver tu post) me ha dado por ver como funciona malloc, free, realloc, calloc y lo he comprendido, pero así tendría un ejemplo elaborado para aprender xD

B

Digo lo mismo que #9, puedes subir el ejemplo completo corregido????

Tengo dentro de 2 semanas un exámen de Programación y me sería de mucha utilidad. Gracias.

ReBeNTuk0

Aqui os lo dejo:

http://rafb.net/p/TeNtkH26.html

No esta apenas con comentarios porque no los creia necesario, asi que si teneis alguna duda preguntadme. Hay partes como la de modificar contacto que solo modifico el nombre y la edad, pero bueno, lo demas ya sabreis como es. Saluditos.

LOc0

Una cosita ya que veo que vas progresando con el C. Para leer cadenas pasa de gets() y utiliza fgets(cadena, LONGITUD_CADENA, stdin) El motivo es que gets es una función "peligrosa", ya que lee todo lo que pilla sin comprobar la longitud del búffer donde está almacenando pudiendo provocar un buffer overflow http://en.wikipedia.org/wiki/Buffer_overflow

Con fgets() te evitas esto ya que tú le dices cuántos caracteres como máximo leer. Lo único que tienes que tener en cuenta con fgets es que lee tb el '\n', así que después de leer si se lo quieres quitar haces:

char cadena[LONGITUD_CADENA];

fgets(cadena, LONGITUD_CADENA, stdin);
cadena[strlen(cadena)-1]=0;//Quitas el '\n'

Salu2 ;)

Usuarios habituales