malloc,calloc,realloc,free

malloc,calloc,realloc,free - C - Programmation

Marsh Posté le 24-05-2007 à 20:18:26    

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 :
  1. #include "halde.h"
  2. #include <unistd.h>
  3. #include <errno.h>
  4. #include <string.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #define KENNUNG ((void*)0x00beef00)
  8. #define SIZEMBLOCK (sizeof(mblock))
  9. #define MB (1024*1024)
  10. /* Speicherverwaltung */
  11. typedef struct mblock {
  12. size_t size;
  13. struct mblock *next;
  14. } mblock;
  15. /* globale Variablen */
  16. static char *newmem = NULL;
  17. static mblock *fsp = NULL;
  18. int bloecke = 0;
  19. static mblock *getMblock(void *ptr) {
  20. if(NULL == ptr)
  21.  return NULL;
  22. return (mblock *)((char *)ptr - SIZEMBLOCK);
  23. }
  24. static void init() {
  25. newmem = (char *)sbrk(MB);
  26. if(-1 == (int)newmem) {
  27.  perror("sbrk" );
  28.  exit(EXIT_FAILURE);
  29. } else {
  30.  fsp = (mblock *)newmem;
  31.  fsp->size = MB-SIZEMBLOCK;
  32.  fsp->next = NULL;
  33. }
  34. }
  35. void *malloc(size_t size) {
  36. mblock *fsp_alt = fsp;
  37. mblock *fsp_neu = fsp;
  38. mblock *fsp_merken = fsp;
  39. int units = 0;
  40. int lauf = 0;
  41. if(NULL == newmem) {
  42.  init();
  43. }
  44. if(size == 0)
  45.  return (void *)1;
  46. while(fsp_alt && fsp_alt->size < size) {
  47.  /* Speicher finden */
  48.  fsp_merken = fsp_alt;
  49.  fsp_alt = fsp_alt->next;
  50.  lauf++;
  51. }
  52. if(!fsp_alt) {
  53.  errno = ENOMEM;
  54.  return NULL;
  55. }
  56. units = ((size-1) / SIZEMBLOCK) + 1;
  57. if(fsp_alt->size > (((units + 1) * SIZEMBLOCK) + SIZEMBLOCK)) {
  58.  fsp_neu = fsp_alt + 1 + units;
  59.  fsp_neu->size = fsp_alt->size - (units + 1) * SIZEMBLOCK;
  60.  fsp_neu->next = fsp_alt->next;
  61. } else {
  62.  fsp_neu = fsp_alt->next;
  63. }
  64. fsp_alt->next = KENNUNG;
  65. bloecke++;
  66. if(fsp_alt == fsp)
  67.  fsp = fsp_neu;
  68. else {
  69.  fsp_merken->next = fsp_neu;
  70. }
  71. return ((void *)(fsp_alt + 1));
  72. }
  73. void free(void* ptr) {
  74. mblock *tmp = NULL;
  75. if(NULL == ptr || ptr == (void *)1)
  76.  return;
  77. tmp = getMblock(ptr);
  78. if(tmp->next != KENNUNG) {
  79.  abort();
  80. } else {
  81.  tmp->next = fsp;
  82.  fsp = tmp;
  83. }
  84. }
  85. void *realloc(void *ptr,size_t size) {
  86. mblock *tmp = getMblock(ptr);
  87. if(ptr == (void *)1 || ptr == NULL) {
  88.  return malloc(size);
  89. }
  90. if(size == 0) {
  91.  free(ptr);
  92.  return NULL;
  93. }
  94. if(size == tmp->size) {
  95.  return ptr;
  96. } else {
  97.  void *new = NULL;
  98.  free(ptr);
  99.  new = malloc(size);
  100.  if(new != ptr)
  101.   new = memcpy(new,ptr,tmp->size);
  102.  return new;
  103. }
  104.    return NULL;
  105. }
  106. void *calloc(size_t nmemb, size_t size) {
  107. void *new = malloc(nmemb*size);
  108. if(new)
  109.  memset(new,0,nmemb*size);
  110.    return new;
  111. }

Reply

Marsh Posté le 24-05-2007 à 20:18:26   

Reply

Marsh Posté le 24-05-2007 à 21:09:16    

Euh... direct là, en ligne 114 (realloc) tu libères une zone alors que tu t'en sers 3 lignes au dessous => bug assuré !!!


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 28-05-2007 à 12:14:13    

C'est la premiere fois que je vois un francais qui fait un exercice en allemand (enfin, je crois que c'est de l'allemand)
T'es sur qu'il est de toi ton code ??
Et c'est quoi cette adresse en dur dans le code 'KENNUNG' ??

Reply

Marsh Posté le 28-05-2007 à 19:27:54    

il est de bel et bien moi. En fait je fais mes etudes en allemand mais je travaille avec les francais.
Le veritable probleme se trouve dans la fonction malloc lorsque size >1MB

Reply

Marsh Posté le 29-05-2007 à 07:58:58    

KENNUNG = 0X00beef00 franchement ça ça peut pas marcher, tout le monde sait que KENNUNG vaut 0xdeadbeef.

Reply

Marsh Posté le 29-05-2007 à 10:16:25    

non c'est BIGMAC qui vaut 0xdeadbeef !

Reply

Marsh Posté le 29-05-2007 à 10:32:18    

lia20 a écrit :

il est de bel et bien moi. En fait je fais mes etudes en allemand mais je travaille avec les francais.
Le veritable probleme se trouve dans la fonction malloc lorsque size >1MB


 
Et alors, c'est quoi le probleme ??
Ton exo, c'est de ne pas alloué plus de 1MB ?
alors si tu as sus codé le reste, tu sauras faire un test et renvoyé NULL pour dire que tu n'alloues pas la demande :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed