title: C code for implementing my own malloc function
body: <p>I have a problem with my C code. I have to make a malloc function. First of all there is my code: </p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;unistd.h&gt;
  #include "my-malloc.h"
  #define MOST_RESTRICTING_TYPE double
  // Pour s’aligner sur des frontieres multiples
  // de la taille du type le plus contraignant
  typedef union header {// Header de bloc
      struct{
          unsigned int size; // Taille du bloc
          union header *ptr;// bloc libre suivant
      } info;
      MOST_RESTRICTING_TYPE dummy;// Ne sert qu’a provoquer un alignement
  } Header;
  
  
  /* Une version de my-malloc.c qu'il faudra vite remplacer par quelque chose de
   * plus "raisonnable". Ce code n'est juste là que pour pouvoir lancer
   * les programmes de test.
   */
  static int nb_alloc   = 0;      /* Nombre de fois où on alloué     */
  static int nb_dealloc = 0;      /* Nombre de fois où on désalloué  */
  static int nb_sbrk    = 0;      /* nombre de fois où a appelé sbrk */
  static Header sentinelle;
  
  void *mymalloc(size_t size) {
      int sbrkUsage=0;
      static Header *bloc;
      static Header *nextBloc;
      nb_alloc += 1;
      printf("mymalloc(%zu)\n",size);
      if(bloc==NULL){     
          bloc=&amp;sentinelle;
          sentinelle.info.size=0;
          sentinelle.info.ptr=bloc;
      }
  
      Header *ptr = &amp;sentinelle;
      Header *ptr_prec = &amp;sentinelle;
      while((ptr=ptr-&gt;info.ptr)!=&amp;sentinelle){        
          ptr_prec=ptr;
          if(ptr-&gt;info.size &gt;= (size+sizeof(Header)))
              break;      
      }
  
      if(ptr==&amp;sentinelle){
          if((bloc=sbrk(800))==(void *)-1){
              printf("ERREUR\n");
          }
          nb_sbrk++;
          printf("\t--&gt;sbrk(800)\n");
          sbrkUsage=1;
          bloc-&gt;info.size=800;
          bloc-&gt;info.ptr=&amp;sentinelle;
          ptr_prec-&gt;info.ptr=bloc;
      }
  
  
      if(sbrkUsage==0){
          bloc-&gt;info.size=size+sizeof(Header);    
          nextBloc=bloc+size+sizeof(Header);
          nextBloc-&gt;info.size=((ptr-&gt;info.size)-(size+sizeof(Header)));
      }
      else{
          nextBloc=bloc+size+sizeof(Header);
          printf("PASSE ? %zu\n",800-(size+sizeof(Header)));
          nextBloc-&gt;info.size=((800)-(size+sizeof(Header)));
          printf("PASSE ? %zu\n",800-(size+sizeof(Header)));
      }
  
      printf("sizeptr : %d\n",ptr-&gt;info.size);
      nextBloc-&gt;info.ptr=&amp;sentinelle;
      ptr_prec-&gt;info.ptr=nextBloc;
      bloc-&gt;info.ptr=nextBloc;
      sentinelle.info.ptr=nextBloc;
  
      //printf("returned : %p\n",&amp;bloc);      
      return bloc;
  }
  
  
  void myfree(void *ptr) {
    nb_dealloc += 1;
    free(ptr);
  }
  
  void *mycalloc(size_t nmemb, size_t size) {
    nb_alloc += 1;
    return calloc(nmemb, size);
  }
  
  void *myrealloc(void *ptr, size_t size) {
    /* il faudrait probablement changer les valeur de nballoc et
     * nb_dealloc dans une véritable implémentation 
     */
    return realloc(ptr, size);
  }
  
  #ifdef MALLOC_DBG
  void mymalloc_infos(char *msg) {
    if (msg) fprintf(stderr, "**********\n*** %s\n", msg);
  
    fprintf(stderr, "# allocs = %3d - # deallocs = %3d - # sbrk = %3d\n",
        nb_alloc, nb_dealloc, nb_sbrk);
    /* Ca pourrait être pas mal d'afficher ici les blocs dans la liste libre */
  
    if (msg) fprintf(stderr, "**********\n\n");
  }
  #endif
  </code></pre>
  
  <p>And I don't understand why I have a segfault here :</p>
  
  <pre><code>printf("PASSE ? %zu\n",800-(size+sizeof(Header)));
  nextBloc-&gt;info.size=((800)-(size+sizeof(Header)));
  printf("PASSE ? %zu\n",800-(size+sizeof(Header)));
  </code></pre>
  
  <p>I am on it for 2Hours and can't find the error ...</p>
  
  <p>if someone can help me it will be great. Thanks.</p>