Allouer dynamiquement de la mémoire
Fermé
helloworld98
-
3 janv. 2021 à 14:50
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 - 3 janv. 2021 à 19:10
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 - 3 janv. 2021 à 19:10
A voir également:
- Allouer dynamiquement de la mémoire
- Mémoire vive - Guide
- L'état de la mémoire ne peut pas être written - Astuces et Solutions
- Le nom du champ de tableau croisé dynamique n'est pas valide ✓ - Forum Excel
- Mémoire virtuelle pour 16 go de ram ✓ - Forum Windows 10
- Impossible d'afficher le rapport de tableau croisé dynamique sur un rapport existant ✓ - Forum Excel
3 réponses
NHenry
Messages postés
15173
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
21 décembre 2024
350
3 janv. 2021 à 15:33
3 janv. 2021 à 15:33
Les système d'allocations de mémoires allouent par block (caché du programme, c'est l'OS qui gère).
donc tu peux parfois dépasser un peu, mais c'est très risqué car ça dépend de l'humeur du système.
donc tu peux parfois dépasser un peu, mais c'est très risqué car ça dépend de l'humeur du système.
Voila mon code complet, ici je free mon tableau et la mémoire alloué à l'interieur
Mais valgrind me dit que je n'ai pas libérer toute la mémoire, mais quand je fait free(p1) et free(p2) il me mets une erreur.
Et aussi, quand j'alloue la mémoire dans mon tableau ou non ça ne change rien au fonctionnement du programme ducoup je ne sais pas si c'est vraiment nécessaire et à quelle moment ça l'est vraiment
Mais valgrind me dit que je n'ai pas libérer toute la mémoire, mais quand je fait free(p1) et free(p2) il me mets une erreur.
Et aussi, quand j'alloue la mémoire dans mon tableau ou non ça ne change rien au fonctionnement du programme ducoup je ne sais pas si c'est vraiment nécessaire et à quelle moment ça l'est vraiment
#include <stdio.h> #include <stdlib.h> typedef struct Person{ char* name; int age; }Person; int main(int argc, char **argv){ Person *p1 = malloc(sizeof(Person)); p1->name = "Mark"; p1->age = 25; Person *p2 = malloc(sizeof(Person)); p2->name = "Stephan"; p2->age = 35; Person** tabPerson = malloc(2 * sizeof(Person*)); for (int i = 0; i < 2; i++) { tabPerson[i] = malloc(sizeof(Person)); } tabPerson[0] = p1; tabPerson[1] = p2; for (int i = 0; i < 2; i++) { printf("%s - %d \n", tabPerson[i]->name, tabPerson[i]->age); } //free for (int i = 0; i < 2; i++) { free(tabPerson[i]); } free(tabPerson); }
yg_be
Messages postés
23405
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 décembre 2024
1 557
3 janv. 2021 à 16:33
3 janv. 2021 à 16:33
cela me semble simple.
à quel endroit fais-tu les free de p1 et de p2?
combien fais-tu de malloc, combien fais-tu de free?
ajoute à coté de chaque free, en commentaire, l'instruction contenant le malloc correspondant.
n'hésite pas à afficher les valeurs des pointeurs, après chaque malloc et avant chaque free: je pense que cela t'aidera à comprendre ton programme.
à quel endroit fais-tu les free de p1 et de p2?
combien fais-tu de malloc, combien fais-tu de free?
ajoute à coté de chaque free, en commentaire, l'instruction contenant le malloc correspondant.
n'hésite pas à afficher les valeurs des pointeurs, après chaque malloc et avant chaque free: je pense que cela t'aidera à comprendre ton programme.
yg_be
Messages postés
23405
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 décembre 2024
1 557
3 janv. 2021 à 17:54
3 janv. 2021 à 17:54
tu écris "quand j'alloue la mémoire dans mon tableau". peux-tu être factuel: de quelle lignes de code s'agit-il?
Dalfab
Messages postés
706
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
2 novembre 2023
101
3 janv. 2021 à 19:10
3 janv. 2021 à 19:10
Bonjour,
Tu dois vraiment aimer les pointeurs, tu en as utilisé beaucoup. Et même un pointeur de pointeurs. Ton code est cependant presque correct.
Ligne 21, tu décides d'allouer de la mémoire tu mémorises sa position dans
En supprimant les lignes 19 à 22, tu résous tout. Vois-tu pourquoi?
Tu dois vraiment aimer les pointeurs, tu en as utilisé beaucoup. Et même un pointeur de pointeurs. Ton code est cependant presque correct.
Ligne 21, tu décides d'allouer de la mémoire tu mémorises sa position dans
tabPerson[i]. Mais lignes 24 et 25, tu changes d'avis et décides que les
tabPerson[i]désignerons désormais les mêmes endroits que
p1et
p2. Et les 2 mémoires que tu as allouées ligne 21, que deviennent-elle? Tu as perdu leurs adresses et désormais il sera impossible de les libérer!
En supprimant les lignes 19 à 22, tu résous tout. Vois-tu pourquoi?
3 janv. 2021 à 16:03
Dans le code si dessous j'alloue un tableau de 2 personnes comme ceci et cela fonctionne.
Mais de base je fesait toujours comme ça
Par contre dans la deuxième solution j'ai du mal à libérer toute la mémoire après ducoup je ne comprend pas très bien de quelle façon il faut alloué dynamiquement de la mémoire
3 janv. 2021 à 16:07
ce serait-plus clair si tu montrais des programmes complets, inclus comment tu libères la mémoire.