Allouer dynamiquement de la mémoire
helloworld98
-
Dalfab Messages postés 706 Date d'inscription Statut Membre Dernière intervention -
Dalfab Messages postés 706 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'apprends le c et j'ai un problème dans la compréhension de la mémoire.
Dans le code si dessous, j'ai d'abord alloué un tableau de pointeurs et ensuite j'ai alloué de la mémoire pour chaque cellule de mon tableau pour pouvoir stocker des chaines de caractères. Cependant, plus bas je refais le même mais simplement en allouant une seule fois et cela fonctionne aussi ? Pourquoi ?
Deuxièmement, pourquoi je sais entrer 5 chaines sans segmentation fault ? Mais une 6ème n'est plus possible alors que je n'ai alloué que 4 char* ?
Merci
J'apprends le c et j'ai un problème dans la compréhension de la mémoire.
Dans le code si dessous, j'ai d'abord alloué un tableau de pointeurs et ensuite j'ai alloué de la mémoire pour chaque cellule de mon tableau pour pouvoir stocker des chaines de caractères. Cependant, plus bas je refais le même mais simplement en allouant une seule fois et cela fonctionne aussi ? Pourquoi ?
Deuxièmement, pourquoi je sais entrer 5 chaines sans segmentation fault ? Mais une 6ème n'est plus possible alors que je n'ai alloué que 4 char* ?
Merci
int main(int argc, char **argv){ /*char** tabstr = malloc(3 * sizeof(char*)); for (int i = 0; i < 10; i++) { tabstr[i] = malloc(20 * sizeof(char)); }*/ char** tabstr = malloc(4 * sizeof(char*)); tabstr[0] = "hi"; tabstr[1] = "bye"; tabstr[2] = "hehe"; tabstr[3] = "a string"; tabstr[4] = "another string"; for (int i = 0; i < 6; i++) { printf("%s \n", tabstr[i]); } }
Configuration: Windows / Chrome 87.0.4280.101
A voir également:
- Allouer dynamiquement de la mémoire
- Mémoire vive - Guide
- RAM : type, format, CAS, vitesse, tout sur la mémoire vive - Guide
- Nettoyer memoire iphone - Guide
- C'est un secret bien gardé : ce réglage d'expert peut doper les performances de votre PC - Guide
- Mémoire virtuelle pour 32 go de ram - Guide
3 réponses
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); }
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.
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?
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
ce serait-plus clair si tu montrais des programmes complets, inclus comment tu libères la mémoire.