Malloc,calloc,realloc,free

cs_halima Messages postés 8 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 24 mai 2007 - 24 mai 2007 à 20:46
cs_halima Messages postés 8 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 24 mai 2007 - 24 mai 2007 à 21:34
Bonjour je dois ecrire les fonction malloc calloc realloc et free
pour qu'ils agissent exactement comme ceux de la bibliothe (stdlib).le
maximun de memoire a allouer est 1MB et je dois gerer toutes les
erreurs d'allocation.jai ecris une partie mais jai des pb avec la
fonction malloc.Si quelqu'un l'a deja fais j'aimerai bien voir les
codes pour comparer et me debloquer.Sinon j'aimerai bien de l'aide.

 


Code :



<ol>
<li class="li1">


#include "halde.h"


</li>
<li class="li1">


#include


</li>
<li class="li1">


#include <errno.h>


</li>
<li class="li1">


#include <string.h>


</li>
<li class="li1">


#include <stdio.h>


</li>
<li class="li1">


#include <stdlib.h>


</li>
<li class="li1">

 

</li>
<li class="li1">


#define KENNUNG ((void*)0x00beef00)


</li>
<li class="li1">


#define SIZEMBLOCK (sizeof(mblock))


</li>
<li class="li1">


#define MB (1024*1024)


</li>
<li class="li1">

 

</li>
<li class="li1">


/* Speicherverwaltung */


</li>
<li class="li1">


typedef
struct mblock {

</li>
<li class="li1">

    size_t size;

</li>
<li class="li1">

    struct mblock *next;

</li>
<li class="li1">


} mblock;

</li>
<li class="li1">

 

</li>
<li class="li1">


/* globale Variablen */


</li>
<li class="li1">


static
char *newmem = NULL;

</li>
<li class="li1">


static mblock *fsp = NULL;

</li>
<li class="li1">

 

</li>
<li class="li1">


int bloecke = 0;

</li>
<li class="li1">

 

</li>
<li class="li1">


static mblock *getMblock(void *ptr){

</li>
<li class="li1">

    if(NULL == ptr)

</li>
<li class="li1">

        returnNULL;

</li>
<li class="li1">

    return(mblock *)((char *)ptr - SIZEMBLOCK);

</li>
<li class="li1">


}


</li>
<li class="li1">

 

</li>
<li class="li1">


static
void init(){

</li>
<li class="li1">

    newmem = (char *)sbrk(MB);

</li>
<li class="li1">

    if(-1 == (int)newmem){

</li>
<li class="li1">

        perror("sbrk");

</li>
<li class="li1">

        exit(EXIT_FAILURE);

</li>
<li class="li1">

    }else{

</li>
<li class="li1">

        fsp = (mblock *)newmem;

</li>
<li class="li1">

        fsp->size = MB-SIZEMBLOCK;

</li>
<li class="li1">

        fsp->next = NULL;

</li>
<li class="li1">

    }

</li>
<li class="li1">


}


</li>
<li class="li1">

 

</li>
<li class="li1">


void *malloc(size_t size){

</li>
<li class="li1">

    mblock *fsp_alt = fsp;

</li>
<li class="li1">

    mblock *fsp_neu = fsp;

</li>
<li class="li1">

    mblock *fsp_merken = fsp;

</li>
<li class="li1">

    int units = 0;

</li>
<li class="li1">

    int lauf = 0;

</li>
<li class="li1">

    

</li>
<li class="li1">

    if(NULL == newmem){

</li>
<li class="li1">

        init();

</li>
<li class="li1">

    }

</li>
<li class="li1">

 

</li>
<li class="li1">

    if(size == 0)

</li>
<li class="li1">

        return(void *)1;

</li>
<li class="li1">

    

</li>
<li class="li1">

    while(fsp_alt && fsp_alt->size < size){

</li>
<li class="li1">

        /* Speicher finden */

</li>
<li class="li1">

        fsp_merken = fsp_alt;

</li>
<li class="li1">

        fsp_alt = fsp_alt->next;

</li>
<li class="li1">

        lauf++;

</li>
<li class="li1">

    }

</li>
<li class="li1">

    

</li>
<li class="li1">

    if(!fsp_alt){

</li>
<li class="li1">

        errno = ENOMEM;

</li>
<li class="li1">

        returnNULL;

</li>
<li class="li1">

    }

</li>
<li class="li1">

 

</li>
<li class="li1">

    units = ((size-1) / SIZEMBLOCK) + 1;

</li>
<li class="li1">

    if(fsp_alt->size > (((units + 1) * SIZEMBLOCK) + SIZEMBLOCK)){

</li>
<li class="li1">

        fsp_neu = fsp_alt + 1 + units;

</li>
<li class="li1">

        fsp_neu->size = fsp_alt->size - (units + 1) * SIZEMBLOCK;

</li>
<li class="li1">

        fsp_neu->next = fsp_alt->next;

</li>
<li class="li1">

    }else{

</li>
<li class="li1">

        fsp_neu = fsp_alt->next;

</li>
<li class="li1">

    }

</li>
<li class="li1">

    fsp_alt->next = KENNUNG;

</li>
<li class="li1">

    bloecke++;

</li>
<li class="li1">

    

</li>
<li class="li1">

    if(fsp_alt == fsp)

</li>
<li class="li1">

        fsp = fsp_neu;

</li>
<li class="li1">

    else{

</li>
<li class="li1">

        fsp_merken->next = fsp_neu;

</li>
<li class="li1">

    }

</li>
<li class="li1">

 

</li>
<li class="li1">

    return((void *)(fsp_alt + 1));

</li>
<li class="li1">


}


</li>
<li class="li1">

 

</li>
<li class="li1">


void
free
(
void* ptr){

</li>
<li class="li1">

    mblock *tmp = NULL;

</li>
<li class="li1">
    if(NULL ptr || ptr (void *)1)

</li>
<li class="li1">

        return;

</li>
<li class="li1">

    tmp = getMblock(ptr);

</li>
<li class="li1">

    if(tmp->next != KENNUNG){

</li>
<li class="li1">

        abort();

</li>
<li class="li1">

    }else{

</li>
<li class="li1">

        tmp->next = fsp;

</li>
<li class="li1">

        fsp = tmp;

</li>
<li class="li1">

    }

</li>
<li class="li1">


}


</li>
<li class="li1">

 

</li>
<li class="li1">


void *realloc(void *ptr,size_t size){

</li>
<li class="li1">

    mblock *tmp = getMblock(ptr);

</li>
<li class="li1">
    if(ptr (void *)1 || ptr NULL){

</li>
<li class="li1">

        returnmalloc(size);

</li>
<li class="li1">

    }

</li>
<li class="li1">

    if(size == 0){

</li>
<li class="li1">

        free(ptr);

</li>
<li class="li1">

        returnNULL;

</li>
<li class="li1">

    }

</li>
<li class="li1">

    if(size == tmp->size){

</li>
<li class="li1">

        return ptr;

</li>
<li class="li1">

    }else{

</li>
<li class="li1">

        void *new = NULL;

</li>
<li class="li1">

        free(ptr);

</li>
<li class="li1">

        new = malloc(size);

</li>
<li class="li1">

        if(new != ptr)

</li>
<li class="li1">

            new = memcpy(new,ptr,tmp->size);

</li>
<li class="li1">

        returnnew;

</li>
<li class="li1">

    }

</li>
<li class="li1">

    

</li>
<li class="li1">

    

</li>
<li class="li1">

  returnNULL;

</li>
<li class="li1">


}


</li>
<li class="li1">

 

</li>
<li class="li1">


void *calloc(size_t nmemb, size_t size){

</li>
<li class="li1">

    void *new = malloc(nmemb*size);

</li>
<li class="li1">

    if(new)

</li>
<li class="li1">

        memset(new,0,nmemb*size);

</li>
<li class="li1">

  returnnew;

</li>
<li class="li1">


}


</li>
</ol>

3 réponses

acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
24 mai 2007 à 21:13
salut
perso j'ai rien compris à ton code
comment alloues-tu la mémoire ??
ce qui me vient à l'idée ça serait de commencer par un tableau global
char mem[1024*1024];
ensuite tu alloues des blocs à l'intérieur de cette memoire
en faisant comme les compilateurs C: la première case du tableau indique la taille de la mémoire qui suit
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
24 mai 2007 à 21:25
"je dois ecrire les fonction malloc..."
Faudra donc appeler les fonctions d'allocation du système hote.
Compilant pour Windows, malloc() finit chez HeapAlloc(), sous Linux aucune idée.

ciao...
BruNews, MVP VC++
0
cs_halima Messages postés 8 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 24 mai 2007
24 mai 2007 à 21:34
c'est vraiment difficile de comprendre avec cet affichage pourtant jai utilisé la balise de code.en fait je cree un espace en utilisant la fonction sbrk(). En fait quant je verifie abec le dbg je me retrouve avec une bouble infinie au niveau de malloc ou free je sais pas trop.je n'arrive pas a reperer l'erreur-
0