[C] Allocation dynamique

    Publicités

Users Who Are Viewing This Thread (Total: 0, Members: 0, Guests: 0)

Status
Not open for further replies.

fsadki

Membre d'Honneur
V
Jun 1, 2010
8,168
1
944
30
Euh... Chez moi
Salut,



Pour la petite information, je suis actuellement en DUT informatique.
Nous avons vue le langage C dans toute sa splendeur ( pointeurs, structures, tableau, différents tris etc...).
En revanche une petite question reste dans ma tête et étant impatient ( car mon prochain cours de Programmation sera le Vendredi), je la poste ici.

Cela concerne la fonction malloc et free.
Autant être le plus explicite possible, je sais que la fonction malloc permet d'allouer un espace mémoire, et que à l'inverse la fonction free la libère.
J'ai appris ses définitions sans réellement les comprendre, du moins je ne saurais les utiliser.. ( honte a moi :non: ).

Donc, disons plutôt que mon problème est que je ne vois pas à quoi ça sert. Admettons que je crée un répertoire téléphonique, si j'alloue une mémoire pour l'inscription, puis que je ferme le programme. Une fois relancé, si j'affiche mon répertoire, sera t-il vide ou non ?
(Je tiens a préciser que le programme se lance sur une console).




Merci d'avance ;

Cordialement,

Fsadki.
 

Evaelis

La Voix de la Sagesse
V
Ancien staff
Apr 28, 2010
22,949
468
1,699
Valhalla
Si je ne me trompe pas, une fois ton programme fermé, toutes les instances de mémoire ouverte seront fermées et écrasées.
 

fsadki

Membre d'Honneur
V
Jun 1, 2010
8,168
1
944
30
Euh... Chez moi
Oui tout à fait.
De toute façon si je relance le programme avec le même code, j'ai essayer et ça écrase / ou ça supprime.
Donc quel est l'intérêt de la fonction malloc ?
 
May 23, 2013
508
0
322
'merica
C'est pour pouvoir utiliser la mémoire de l'OS. (Heap)

malloc te 'donne' (alloue) un espace mémoire, free le libère pour que l'OS le passe a d'autres applications.
 

Evaelis

La Voix de la Sagesse
V
Ancien staff
Apr 28, 2010
22,949
468
1,699
Valhalla
Si j'ai bien compris, ça permet de ne pas garder un espace de mémoire (vide) occupé alors qu'une autre application en aurait besoin.
Optimiser les performances ?
 
May 23, 2013
508
0
322
'merica
Si tu oublies d'utiliser 'free'/'delete' la heap va se remplir progressivement, jusqu'au moment ou il n'y a définitivement plus de place en mémoire, ce qui fera crash le programme.

Par contre je ne suis pas sur que la mémoire heap ai un effet sur les performances de l'OS. (mais logiquement oui)
 

fsadki

Membre d'Honneur
V
Jun 1, 2010
8,168
1
944
30
Euh... Chez moi
Cela explique pas mal de chose x)
En revanche y a t-il une réelle utilité a utiliser lorsque l'on lance un programme sous console ?
Ou alors, n'est-ce que pour pouvoir libérer un espace alloué et donc rendre le programme plus rapide ? Donc c'est de l'optimisation ?

Autre chose, admettons que j'alloue une case d'un tableau, si j'ajoute du contenu et que je fais un free dessus, la case sera donc vide si je comprend bien ?

Merci d'avance :)
 

fsadki

Membre d'Honneur
V
Jun 1, 2010
8,168
1
944
30
Euh... Chez moi
May 23, 2013
508
0
322
'merica
Je pense pas que ce soit possible d'allouer seulement une case d'un tableau (en tout cas c'est pas possible en c++). Par contre si tu alloue le tableau en entier, tu doit le 'supprimer' en entier aussi.
 

fsadki

Membre d'Honneur
V
Jun 1, 2010
8,168
1
944
30
Euh... Chez moi
Je pense pas que ce soit possible d'allouer seulement une case d'un tableau (en tout cas c'est pas possible en c++). Par contre si tu alloue le tableau en entier, tu doit le 'supprimer' en entier aussi.

Merci de ta réponse.
Ça résout donc le problème que je me posais sur les cases d'un tableau.
Donc l'allocation peut servir sur un très long code, mais inutile sur un petit programme.
Je vérifierai avec différents TD.
 
May 23, 2013
508
0
322
'merica
L'allocation dynamique peut aussi servir sur de petits programmes. Je te conseille de lire cette page : Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!


En parlant de tableaux, ils fonctionnent justement grâce au pointeurs.
Petite explication en C++ :
Code:
int datarray[] = { 1, 2, 3, 4 };

	int* arrayBase = &datarray[0];

	cout << &datarray[0] << " : " << arrayBase << " : " << *arrayBase << endl;
	cout << &datarray[1] << " : " << (arrayBase + 0x1) << " : " << *(arrayBase + 0x1) << endl;
	cout << &datarray[2] << " : " << (arrayBase + 0x2) << " : " << *(arrayBase + 0x2) << endl;
	cout << &datarray[3] << " : " << (arrayBase + 0x3) << " : " << *(arrayBase + 0x3) << endl;

En gros, pour le compilateur, ' array[n] ' est égal a ' *(&array[0] +n) '.

PS : C'est la même chose pour les char[] et les strings.
 

fsadki

Membre d'Honneur
V
Jun 1, 2010
8,168
1
944
30
Euh... Chez moi
Oui mais dans l'exemple donne, on demande l'âge de l'utilisateur.
Mais que l'on fasse une allocation ou non, ça ne change pas grand chose, vue qu'à la fermeture du programme, l'espace est à nouveau libérer ( dans le cas ou on alloc pas).
Alors que si on utilise les fonctions malloc et free, ça revient à tout faire manuellement.
 
May 23, 2013
508
0
322
'merica
Ça dépend de ce que tu va faire avec l'age, si c'est juste pour le demander puis l'afficher dans la console, oui c'est inutile.
 

drov

V
Feb 27, 2012
1,427
1
944
En console c'est useless, ça sert principalement à gérer la mémoire et éviter les fuites de mémoire. ( pour éviter des programmes genre firefox qui bouffent 700 mo au bout d'une heure ^^)
 
Status
Not open for further replies.