Bonjours,
J'ai fait quelques recherche sur la fonction realloc pour savoir comment l'utiliser dans mon programme en passant notamment par :
https://fr.wikibooks.org/wiki/Progra...a_m%C3%A9moire
http://rperrot.developpez.com/articles/c/allocationC/
https://www.gladir.com/CODER/C/realloc.htm
Ils donnent plusieurs définitions ou explications similaire :
realloc tentera de réajuster la taille du bloc pointé par ancien_bloc à la nouvelle taille spécifiée
a fonction realloc() tente de redimensionner un bloc mémoire
Cette fonction permet de changer la taille d'un bloc de mémoire dynamique
"Nous passons donc comme premier argment tableau, qui est le pointeur que l'on va redimenssioner"
De cette ambiguïté l'ont peut penser de la façon suivante :
Realloc tente de redimensionner le bloc pointer par le premier argument en regardant s'il y a de la place en mémoire à sa suite, si oui il est agrandi, sinon cela ne marche pas.
J'espère que cela pourra en aider plus d'un à y voir plus clair!
Je propose donc de rajouter dans la FAQ C en 4.5 :
Realloc comment ça marche?
Lors d'une pratique de l'allocation mémoire, parfois l'envie d'augmenter ou de diminué la taille d'une allocation se fait sentir. La fonction realloc est utile principalement dans ces deux cas.
prototype de la fonction realloc :
void *realloc(void *blocACopier, size_t nouvelleTaille);
Le plus couramment : pour une augmentation, la fonction realloc va chercher en mémoire la taille demandé en second argument et y recopier le contenu pointer par le premier argument puis le libère automatiquement. Si elle échoue à n'en pas trouvé, NULL est retourné et elle ne libère pas le contenu pointer par le premier argument. Il est à savoir que la fonction realloc ne peut échouer que dans le cas d'une augmentation.
La fonction realloc peut alors s'interpréter (le code suivant n'est pas compilable) de la façon suivante :
Dans le cas d'une augmentation comme la fonction realloc peut échoué, il est recommandé de l'utilisé de la façon suivante (le code suivant peut être compilé et exécuté):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 void *realloc(void *blocACopier, size_t nouvelleTaille){ void *tmp=malloc(nouvelleTaille); //allocation d'une nouvelle zone mémoire if(tmp==NULL){ //allocation raté return NULL; } memcopy(tmp, blocACopier, ancienneTaille); //copie free(blocACopier); //libération return tmp; }
Pour une diminution, la fonction realloc peut agir sois comme précédemment, sans échec possible, et allouer une nouvelle zone mémoire, recopier, et retourner un pointeur différent. Sois simplement diminuer la taille du bloc alloué et retourner un pointeur égal au premier argument.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #include <stdlib.h> #include <stdio.h> int main(){ char *a=(char*)malloc(sizeof(char)*8); //première allocation printf("%p : adresse de a alloc\n", a); void *tmp=realloc(a, sizeof(char)*16); //on désire un bloc 2 fois plus grand if(tmp==NULL){ printf("Echec de la reallocation mémoire\n"); exit(1); } printf("Réussite de la reallocation mémoire !\n"); a=(char*)tmp; printf("%p : adresse de a realloc\n", a); return 0; }
Pour finir, la fonction realloc peut être utilisée de la même façon que la fonction malloc en mettant le premier argument a NULL.
Partager