Ver Mensaje Individual
  #1 (permalink)  
Antiguo 16/05/2013, 12:40
eduh4l
 
Fecha de Ingreso: enero-2011
Mensajes: 9
Antigüedad: 13 años, 10 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.