2010-11-21 4 views
0
int * mymalloc(int *array, int size){ 

    //PRINTS THE TIMES MYMALLOC IS CALLED. JUST FOR TESTING; 
    printf("~~~~~~~~~~~~~~~TIME(S) MYMALLOC WAS CALLED:~~~~~~~~~~~~~~~ %d\n", i++); 

    //checks 
    if(size<1){ 
     printf("SIZE NOT VALID\n"); 
     return (int *) 0; 
    } 

    printf("MEMORY FREE JUST WHEN MYMALLOC() IS CALLED: %d\n", (*((BLOCK *)array[0])).size); 

    BLOCK currentHeader = (*((BLOCK *)array[0])); 

    do{ 
    printf("CURRENT HEADER STATUS: %d\n", currentHeader.status); 
     if(currentHeader.status == 0){ 
      printf("ok\n"); 
      if(currentHeader.size >= size){ 

       currentHeader.status = 1; 

       if(currentHeader.size - size < sizeof(currentHeader)) 
        return &array[currentHeader.data]; 

       else{ 

        BLOCK nextHeader; 

        array[size + currentHeader.data] = (int)&nextHeader; 

        if(currentHeader.nextb !=0){ 

         (*currentHeader.nextb).previousb = &nextHeader; 
         nextHeader.nextb = currentHeader.nextb; 
        } 

        currentHeader.nextb = &nextHeader; 
        nextHeader.previousb = &currentHeader; 

        nextHeader.size = currentHeader.size - size - sizeof(nextHeader);//here? 

        nextHeader.data = currentHeader.data + size + sizeof(nextHeader); //here? 
        printf("NEXT HEADER DATA: %d\n", nextHeader.data); 

        nextHeader.status = 0; 
        currentHeader.size = size; //changing the currentHeader.size to the "size" given. 

        printf("%d\n", sizeof(currentHeader)); 
        printf("%d\n", size + currentHeader.data); 
        printf("%d\n", nextHeader.size); 


        printf("i return\n"); 

        return &array[currentHeader.data]; 


       } 
      } 
      //printf("NOT ENOUGH SIZE"); 
     } 

     if(currentHeader.nextb !=0){ 
      printf("%d\n",*currentHeader.nextb); 
      currentHeader = *currentHeader.nextb; 

     } 

    }while (currentHeader.nextb != 0); 

    return (int *) 0; 
    //printf("%d\n", (*((BLOCK *)array[0])).status); 

} 

gars ok quand je lance ce programme, en fait quand je l'appelle cette méthode, comme celui-ciétrange Segmentation fault en C

mymalloc(testarray,50); 

quand je commente la ligne printf("ok\n"); je reçois une erreur de segmentation.
Je veux dire que c'est juste une fonction printf. comment peut-il affecter la mémoire ??????
vous pouvez copier le coller sur vos machines et l'essayer?
d'abord avec la printf("ok\n");
puis //printf("ok\n");

+0

Exécutez-le? bien, mais pourriez-vous nous donner toute la source dont nous avons besoin? – steabert

Répondre

0

si vous commentez cette ligne et il se bloque, cela signifie que votre pile est corrompu. Ainsi, l'accident peut apparaître et/ou disparaître sans raison apparente à un point "aléatoire" (bien sûr, ce n'est pas vraiment aléatoire, mais cela peut sembler être le cas).

Pouvez-vous générer des core-dumps et/ou exécuter avec valgrind et/ou étape-par-étape le déboguer?

+0

im en train de compiler le code en utilisant putty, sur une machine linux. le fichier est stocké dans un répertoire partagé. – shadow7

+0

et im juste en train de l'éditer avec notepad ++ de ma machine – shadow7

+0

vérifiez si valgrind ou gdb sont disponibles dans votre shell à distance – Simone

0

Au lieu de le faire "à la main". Je suggère d'utiliser un outil approprié pour cela, comme valgrind ou gprof.

+0

"vérifier si valgrind ou gdb sont disponibles dans votre shell distant" – shadow7

+0

comment puis-je vérifier? – shadow7

+0

Vous recherchez des fuites de mémoire, correct? Dans ce cas, utilisez valgrind. http://cs.ecs.baylor.edu/~donahoo/tools/valgrind/ – BastiBen