Avatar billede kreinoee Nybegynder
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.
Avatar billede arne_v Ekspert
08. februar 2006 - 19:39 #1
det er jo nok en af de her som driller:

hentPerson()

sorterPatient();

den postede kode ser ret uskyldig ud
Avatar billede kreinoee Nybegynder
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;

    }
Avatar billede arne_v Ekspert
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)
Avatar billede arne_v Ekspert
12. marts 2006 - 05:19 #4
kommet videre ?
Avatar billede kreinoee Nybegynder
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.
Avatar billede arne_v Ekspert
12. marts 2006 - 15:34 #6
nej tak
Avatar billede kreinoee Nybegynder
25. marts 2006 - 22:11 #7
Bør vel lige lukke denne.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester