Bonjour à tous,
je débute en programmation et j'ai énormément de mal à comprendre le fonctionnement de malloc() et de free().
Tel que je l'ai compris, malloc() permet d'allouer de la mémoire de façon dynamique au programme, free() permet de la libérer, donc de permettre au système de réutiliser cette mémoire comme il l'entend. Cependant, en pratique j'ai l'impression que ca ne fonctionne pas comme ça.
On me demande de recoder plusieurs fonction de la libcet pour mes tests unitaires, je joue avec des fonctions qui utilisent malloc() et free() mais j'ai l'impression que malloc(SIZE) m'alloue beaucoup plus que SIZE. En cherchant un peu j'ai cru comprendre quemalloc, lors de son premier appel, va allouer un minimum d'une 'PAGESIZE' soit environ 128ko d'après le man mais j'ai essayé 1 000 000 et ca passe mais 1 000 000 000 ca passe. Premier problème car lorsque je code des programme qui utilise bien moins que 10 000 octets j'arrive a segfault alors que j'alloue bien toutes mes variables. (Exemple Splitwhitespace)
Mon autre interrogation porte sur free(). En cherchant un peu, j'ai compris que "libérer" la mémoire signifie permettre au système d'utiliser la mémoire allouer précèdemment avec malloc(), realloc(), calloc(). Mais donc, selon moi, si la mémoire est libérée alors le programme ne peut plus la réutiliser à moins de redemander l'autorisation au système.
et le retour de ce programme :
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
23
24
25
26
27
28
29
30
31
32
33
34
35 #include "libft.h" #include <stdio.h> #include <stdlib.h> int main() { int i = 0; char *s_test = (char*)malloc(sizeof(char) * (7)); s_test[0] = 'c'; s_test[1] = 'o'; s_test[2] = 'u'; s_test[3] = 'c'; s_test[4] = 'o'; s_test[5] = 'u'; s_test[6] = 0; printf("%s\n", s_test); while (i < 7) printf("%p\n", &s_test[i++]); free(s_test); i = 0; s_test[0] = 'c'; s_test[1] = 'o'; s_test[2] = 'u'; s_test[3] = 'c'; s_test[4] = 'o'; s_test[5] = 'u'; s_test[6] = 0; printf("%s\n", s_test); while (i < 7) printf("%p\n", &s_test[i++]); return (0); }
coucou
0x7fe96cc02600
0x7fe96cc02601
0x7fe96cc02602
0x7fe96cc02603
0x7fe96cc02604
0x7fe96cc02605
0x7fe96cc02606
coucou
0x7fe96cc02600
0x7fe96cc02601
0x7fe96cc02602
0x7fe96cc02603
0x7fe96cc02604
0x7fe96cc02605
0x7fe96cc02606
Si j'ai cherché à afficher les adresses, c'était pour voir si free() agissait sur les adresses, et j'écris caractères par caractères car j'avais l'impression que c'était différent de faire s_test = "coucou".
Egalement, toujours sur free(), le programme suivant :
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 #include "libft.h" void ft_strdel(char **as) { size_t index; char *as_l; as_l = *as; index = 0; while (as_l[index] != 0) { free(&as_l[index]); index += 1; } *as = NULL; }
avec le main associé :
me renvoie ca :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #include "libft.h" #include <stdio.h> #include <stdlib.h> int main() { char *s_test = (char*)malloc(sizeof(char) * (7)); s_test = "coucou"; ft_strdel(&s_test); return (0); }
e1r2p7% ./a.out
a.out(75304,0x7fffc69683c0) malloc: *** error for object 0x10bb88fa8: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
zsh: abort ./a.out
En cherchant un peu, cette erreur signifie que j'essaie de free quelque chose qui n'a pas été allouer dynamiquement donc avec malloc() et ses copines, mais la pourtant j'ai alloué s_test juste avant.
Désolé si ces questions peuvent sembler basique mais je ne comprend vraiment pas l'allocation dynamique de la memoire en pratique et je sens que j'ai vraiment besoin de le comprendre maintenant pour avancer. Si certains ont des ressources qui explique en détails ces processus je suis preneur !
Merci de m'avoir lu jusque là.
Cordialement
Partager