Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1472 connectés 

  FORUM HardWare.fr
  Programmation
  C

  malloc,calloc,realloc,free

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

malloc,calloc,realloc,free

n°1564863
lia20
Posté le 24-05-2007 à 20:18:26  profilanswer
 

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. }

mood
Publicité
Posté le 24-05-2007 à 20:18:26  profilanswer
 

n°1564899
Sve@r
Posté le 24-05-2007 à 21:09:16  profilanswer
 

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.
n°1566097
nORKy
Grmmph...
Posté le 28-05-2007 à 12:14:13  profilanswer
 

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' ??

n°1566352
lia20
Posté le 28-05-2007 à 19:27:54  profilanswer
 

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

n°1566505
matafan
Posté le 29-05-2007 à 07:58:58  profilanswer
 

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

n°1566540
did-54
Posté le 29-05-2007 à 10:16:25  profilanswer
 

non c'est BIGMAC qui vaut 0xdeadbeef !

n°1566552
nORKy
Grmmph...
Posté le 29-05-2007 à 10:32:18  profilanswer
 

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 :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  malloc,calloc,realloc,free

 

Sujets relatifs
Comment héberger son site sur free sans etre abonné??[PHP-Galerie Photo] SimpleViewerAdmin chez Free
Exécution d'un programme C sur serveur Free [RESOLU]netlor studio et free
Comment se servir des module php de freeSe servir de sa base de donnee chez free
Récupérer le timestamp sous GNU pascal ET free pascal[Résolu] .htaccess chez Free...
[C] coder un malloc??Redirection sur ***.free.fr
Plus de sujets relatifs à : malloc,calloc,realloc,free


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR