08. februar 2006 - 18:53
												Der er
									6 kommentarer													og
					1 løsning									
									
		 
		
			
fejl:  glibc detected  double free or corruption (out)
			Jeg har et problem med følgende kode:
int administrativMedarbejder()
{
    int i = 0;
    while (i == 0)
    {
        if (hentPerson() != 0)
        {
            printf("fejl, systemet afsluttes");
            exit(EXIT_FAILURE);
        }
        sorterPatient();
        printf ("metoden fra administrende medarbejder patient:\n");
        printf("%s \n", patientDerBearbejdes.cprArray);
        printf("%c \n", patientDerBearbejdes.prioritet);
        printf("%c \n", patientDerBearbejdes.skadeartChar);
    }
    
    
        
    return 0;
}
hvis jeg fjerner den første while løkke kører det fint, men så længe den er der for jeg følgende fejl når jeg prøver at kører programmet: *** glibc detected *** double free or corruption (out): 0x0804b1a8 ***. Nogen der ved hvad denne fejl betyder, eventuelt ved hvad der er galt. Jeg ved godt at løkken kører uendeligt, men det er også meningen, den metode den kører sender noget data ind i en message que til en anden process, og det er meningen den bare skal blive ved med dette.
Håber der er nogen der kan hjælpe mig.
					
		
	 
		
								
					
				09. februar 2006 - 11:42
				#2
						
		 
		
			Det resterende kode ser ud som følger:
int hentPerson()
{
    printf("test2");
    patient patientp;
    sleep(2);
    if (msgrcv(msgidPatientTilSkraenke, (void *)&patientp, sizeof(patient) -4, 1, 0) == -1)
    {
        printf("fejl ved msgrcv");
        exit(EXIT_FAILURE);
    }
    int i;
    for (i = 0 ; i < 11 ; i++)
    {
        patientDerBearbejdes.cprArray[i] = patientp.cprArray[i];
    }
    patientDerBearbejdes.prioritet = patientp.prioritet;
    patientDerBearbejdes.skadeartChar = patientp.skadeartChar;
    patientDerBearbejdes.patientType = 1;
    /*printf ("metoden fra hentPerson patient:\n");
    printf("%s \n", patientp.cprArray);
    printf("%c \n", patientp.prioritet);
    printf("%c \n", patientp.skadeartChar);
    */
    return 0;
}
int sorterPatient()
{
    int i = 0;
    while (i == 0)
    {
        int filtjek = open(logtest, O_RDWR | O_CREAT | O_EXCL, 0444);
        if (filtjek != -1)
        {
            i++;
        }
    }
        
    FILE *patientlog;
    FILE *mainLog;
    
         int fejl;
         mainLog = fopen("mainlog","a");
         
         
         if(mainLog == NULL)
         {
             printf("Filen kunne ikke åbnes");
         }
         printf("fejlfinding");
         
         //fprintf(mainLog, "test\n");
         fprintf(mainLog, "%s;", patientDerBearbejdes.cprArray);
         
         
         fejl = fclose(mainLog);
         printf("fejlfinding");
         
         if(fejl != 0)
         {
             printf("fil kunne ikke lukkes");
         }
    if(patientDerBearbejdes.prioritet == 1)
    {
         char *fil = malloc(30);
         strcpy(fil, "/tmp/g2logs/");
         strcat(fil, patientDerBearbejdes.cprArray);
         patientlog = fopen(fil,"w");
         if(patientlog == NULL)
         printf("Filen kunne ikke åbnes");
         fprintf(patientlog, "Patienten er placeret på operationsstuen \n %s", getKlokken());
         fejl = fclose(patientlog);
         if(fejl != 0);
         if (msgsnd(msgidPatientFraSkraenkeTilOperation, (void *)&patientDerBearbejdes, sizeof(patient) -4, 0) == -1)
         {
            printf ("fejl ved msgsnd");
            exit (EXIT_FAILURE);
         }
    }
    else
    {
         char *fil = malloc(30);
         strcpy(fil, "/tmp/g2logs/");
         strcat(fil, patientDerBearbejdes.cprArray);
         patientlog = fopen(patientDerBearbejdes.cprArray,"w");
         if(patientlog == NULL)
         printf("Filen kunne ikke åbnes");
         
         fprintf(patientlog, "Patienten er placeret i venteværelset \n %s", getKlokken());
         fejl = fclose(patientlog);
         
         
         if (msgsnd(msgidPatientFraSkraenkeTilVentevaerelse, (void *)&patientDerBearbejdes, sizeof(patient) -4, 0) == -1)
         {
            printf ("fejl ved msgsnd");
            exit (EXIT_FAILURE);
         }
    }
(void)unlink(logtest);
        return 0;         
}
char *getKlokken() //http://souptonuts.sourceforge.net/code/gettimeofday.c.html er tilpasset
    {
        char *tempChar;
         char buffer[30];
         size_t size = 1;
        tempChar = (char *)malloc(size);
         struct timeval tv;
         time_t curtime;
        gettimeofday(&tv, NULL);
         curtime=tv.tv_sec;
            strftime(buffer,30,"%m-%d-%Y  %T.",localtime(&curtime));
       sprintf(tempChar, buffer);
           printf("Test %s \n" , tempChar);
         return tempChar;
    }
		
		
	 
	
		
								
					
				10. februar 2006 - 04:21
				#3
			 				
						
		 
		
			size_t size = 1;
        tempChar = (char *)malloc(size);
      ....
      sprintf(tempChar, buffer);
ser noget suspekt ud !
(at du kun allokerer 1 byte)
		
		
	 
	
		
								
					
				12. marts 2006 - 10:16
				#5
						
		 
		
			Ja, undskyld jeg har glemt at skrive det. Det er fordi jeg aldrig fik kaldt en free på den malloc jeg fik lavet nede i getKlokken metoden, med hensyn til at det ser syspect ud med kun at allokere 1 byte giver jeg dig ret, men jeg har bare kopieret det stykke kode, men har nu skrevet det om. Tak for hjælpen, smid et svar vis du vil have nogle point.