Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Error "double free corruption (top): 0x08050008" al ejecutar la segunda vez.

Estas en el tema de Error "double free corruption (top): 0x08050008" al ejecutar la segunda vez. en el foro de C/C++ en Foros del Web. Buenas tardes gente, tenia de deveres un ejercicio de programacion que consiste en cojer IP's de un fichero y compararlo con una IP introducida manualmente, ...
  #1 (permalink)  
Antiguo 16/05/2013, 12:40
 
Fecha de Ingreso: enero-2011
Mensajes: 9
Antigüedad: 13 años, 3 meses
Puntos: 0
Error "double free corruption (top): 0x08050008" al ejecutar la segunda vez.

Buenas tardes gente, tenia de deveres un ejercicio de programacion que consiste en cojer IP's de un fichero y compararlo con una IP introducida manualmente, de forma que cuando encuentra la coincidencia de IP, tiene que mostrarte dicha IP introducida y el departamento/aula donde se encuentra.

El problema está en que la primera vez que ejecuto la función "cercarIP" me lo hace correctamente; pero la segunda vez me da el error escrito en el título.
Creo que és por algun tema raro del puntero de tipo FILE, pero ni idea de solucionarlo.

He aqui el fichero con nombres de aulas/departamenos y IP's:
Código:
I206: 172.16.0.1 172.16.0.2 172.16.0.3
I210: 172.16.1.4 172.16.1.8 172.16.1.5
Dept1: 172.16.0.8
ARGO: 172.16.0.100 172.16.0.7 172.16.0.16 172.16.0.200
Y aqui el ejercicio entero en C:
Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//Prototips de les funcions

void mostrarMenu(void);
void cercarIp(FILE *arxiu, int contador, int assignacio, int longitud, char cadena[], char departament[], char ipintroduida[], char ip[], int resultat);

//Funció Principal.

int main () {

	//Variables.

	int  contador=0, assignacio=0, longitud=0, opcio=0, resultat=0;
	char cadena[100], departament[50], ipintroduida[20], ip[20];
	FILE *arxiu=fopen ("aules.txt","r");

	while (opcio!=3) {
		mostrarMenu();
		while (opcio<1 || opcio>4) {
			printf ("\n\nEscolleix una opció (1-3) del menú anterior: ");
			scanf ("%d",&opcio);
		}
		switch (opcio) {
			case 1:
				printf ("Per fer.");
				opcio=0;
					break;
			case 2:
				printf ("\nIntrodueïx l'adreça IP: ");
				scanf ("%s",ipintroduida);
				cercarIp (arxiu,contador,assignacio,longitud,cadena,departament,ipintroduida,ip,resultat);
				opcio=0;
					break;
			case 3:
				printf ("\nHa sortit del menù i el programa ha finalitzat.");
					break;
		}
	}
	return 0;
}

// Funcions

void mostrarMenu () {
	printf ("\n\t\t\t----------------------- MENÚ ----------------------");
	printf ("\n\t\t\t|                                                 |");
	printf ("\n\t\t\t| 1 - Crear el document 'aules.txt'.              |");
	printf ("\n\t\t\t| 2 - Cercar una IP per saber el seu departament. |");
	printf ("\n\t\t\t| 3 - Sortir.                                     |");
	printf ("\n\t\t\t|                                                 |");
	printf ("\n\t\t\t---------------------------------------------------");
}

void cercarIp(FILE *arxiu, int contador, int assignacio, int longitud, char cadena[], char departament[], char ipintroduida[], char ip[], int resultat) {
	//contador=0, assignacio=0, longitud=0, resultat=0;
	if (arxiu==NULL) {
		printf("\nNo es pot obrir l'arxiu: 'aules.txt'.");
	} else {
		while (fgets(cadena,100,arxiu) != NULL) {
			longitud=strlen(cadena);

			// Bucle que desa el nom del departament a l'array "departament".
			while (cadena[contador]!=':') {
				departament[assignacio]=cadena[contador];
				assignacio++,contador++;
			}
			departament[assignacio]='\0'; //Assigna el final de cadena per tal de que no imprimeixi basura fins la posició 50.
			assignacio=0, contador=contador+2;
			//Fins aqui tot OK.

			//2n bucle que busca els espais per assignar totes les IP's.
			while (contador<longitud) {
				while (cadena[contador]!= ' ' && cadena[contador]!='\0') {
					ip[assignacio]=cadena[contador];
					assignacio++;
					contador++;
				}
				ip[assignacio]='\0';
				if (strcmp(ip,ipintroduida)==0) {
					printf ("\nAdreça: %s",ipintroduida);
					printf ("\nAquesta adreça es troba a %s\n\n",departament);
					resultat=1;
				}
				contador++, assignacio=0;
			}
			contador=0;
		}
		if (resultat==0) {
			printf ("\nAdreça: %s",ipintroduida);
			printf ("\nAquesta adreça no es troba a cap aula/departament.\n\n");
		}
		fclose(arxiu);
	}
}
Como podeis comprovar; el codigo esta escrito en catalan ... espero que eso no sea problema para entenderlo.

Muchas gracias, saludos.
  #2 (permalink)  
Antiguo 16/05/2013, 13:52
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Error "double free corruption (top): 0x08050008" al ejecutar la segunda ve

Mueve fclose(arxiu); justo arriba de return 0; en la funcion main y en el lugar de fclose haz un fseek(arxiu, 0, SEEK_SET);

Lo que pasa es que al ejecutar la función cercarIp cierras el archivo al tratar de leerlo otra vez te encuentras con errores.

Otra cosa una vez que termines de leer tu archivo regresa al principio del archivo con fseek(arxiu, 0, SEEK_SET);
  #3 (permalink)  
Antiguo 16/05/2013, 23:40
 
Fecha de Ingreso: enero-2011
Mensajes: 9
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Error "double free corruption (top): 0x08050008" al ejecutar la segunda ve

Muchisimas gracias, ya esta solucionado !! Imagino que el error seria que cierro el archivo de la misma funcion.

Etiquetas: double, free, funcion, int, programa, segunda, string, top, variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:21.