Langage C: gestion de mémoire
Résolu
viruk
-
viruk -
viruk -
Bonjour,
j'ai rédigé un bout de programme que voici:
struct image {
int longueur;
int largeur;
int** mat;
};
typedef struct image* img;
img alloc(int a,int b) {
int** mat2= (int**)malloc(a*sizeof(int*));
int k;
for (k=0; k<a; k++){
mat2[k]=(int*)malloc(b*sizeof(int));
}
img mat1=(img)malloc(sizeof(struct image));
mat1->longueur=a;
mat1->largeur=b;
mat1->mat=mat2;
return mat1;
}
ce programme fonctionne il n'y a pas de problème, cependant je me pose une question:
lors du malloc pour libérer de la place pour le type img, combien de place il libère? vu qu'il ne connait pas la taille de la matrice...
et du coup si il libère suffisamment de place, est-ce qu'un free(mat2) ferait planter le programme?
merci pour votre réponse!
j'ai rédigé un bout de programme que voici:
struct image {
int longueur;
int largeur;
int** mat;
};
typedef struct image* img;
img alloc(int a,int b) {
int** mat2= (int**)malloc(a*sizeof(int*));
int k;
for (k=0; k<a; k++){
mat2[k]=(int*)malloc(b*sizeof(int));
}
img mat1=(img)malloc(sizeof(struct image));
mat1->longueur=a;
mat1->largeur=b;
mat1->mat=mat2;
return mat1;
}
ce programme fonctionne il n'y a pas de problème, cependant je me pose une question:
lors du malloc pour libérer de la place pour le type img, combien de place il libère? vu qu'il ne connait pas la taille de la matrice...
et du coup si il libère suffisamment de place, est-ce qu'un free(mat2) ferait planter le programme?
merci pour votre réponse!
A voir également:
- Langage C: gestion de mémoire
- Langage ascii - Guide
- Langage binaire - Guide
- Pascal langage - Télécharger - Édition & Programmation
- Langage visual basic - Télécharger - Langages
- Langage basic gratuit - Télécharger - Édition & Programmation
3 réponses
Attention, un malloc ne libère pas de la place. Il alloue de la place. S'il n'y a plus de place, il renvoie NULL. C'est free() qui libère la place.
Lors de ton malloc pour mat1, ton programme connaît la taille de ta structure : sizeof(int) + sizeof(int) + sizeof(int**) (j'omets volontairement les alignements mémoire). Le programme allouera bien une place de sizeof(int **) bytes dans la pile destinée à recevoir un pointeur sur un pointeur sur des entiers dans le heap. Dis autrement dans la pile, ta structure prend la taille d'une adresse mémoire. C'est en pointant vers cette adresse que tu retrouveras le contenu de ta structure.
free(mat2) ne te fera pas planter le programme. Il libérera juste l'allocation du pointeur mat2. Le problème est que tu ne pourras plus libérer les autres pointeurs mat2[k]. Il faut donc commencer par faire une boucle for de free(mat2[k]) et finir par free(mat2).
Cdlt,
Lors de ton malloc pour mat1, ton programme connaît la taille de ta structure : sizeof(int) + sizeof(int) + sizeof(int**) (j'omets volontairement les alignements mémoire). Le programme allouera bien une place de sizeof(int **) bytes dans la pile destinée à recevoir un pointeur sur un pointeur sur des entiers dans le heap. Dis autrement dans la pile, ta structure prend la taille d'une adresse mémoire. C'est en pointant vers cette adresse que tu retrouveras le contenu de ta structure.
free(mat2) ne te fera pas planter le programme. Il libérera juste l'allocation du pointeur mat2. Le problème est que tu ne pourras plus libérer les autres pointeurs mat2[k]. Il faut donc commencer par faire une boucle for de free(mat2[k]) et finir par free(mat2).
Cdlt,
ok
je te remercie d'avoir pris le temps de me répondre!
Viruk
après essai quand je fais les free et que je tente d'appeler alloc, ca me met une erreur de segmentation. Y'a-t-il un moyen d'éviter ca?
merci!
je te remercie d'avoir pris le temps de me répondre!
Viruk
après essai quand je fais les free et que je tente d'appeler alloc, ca me met une erreur de segmentation. Y'a-t-il un moyen d'éviter ca?
merci!
voici mon code.
et merci de m'avoir indique l'existence de ces balises =)
et merci de m'avoir indique l'existence de ces balises =)
struct image { int longueur; int largeur; int** mat; }; typedef struct image* img; img alloc(int a,int b) { int** mat2= (int**)malloc(a*sizeof(int*)); int k; for (k=0; k<a; k++){ mat2[k]=(int*)malloc(b*sizeof(int)); } img mat1=(img)malloc(sizeof(struct image)); mat1->longueur=a; mat1->largeur=b; mat1->mat=mat2; for(k=0;k<a;k++){ free(mat2[k]); } free(mat2); return mat1; }
On ne sait pas compris. Quand je disais d'utiliser free() c'est lorsuqe tu souhaites désallouer une zone que tu n'utiliseras plus.
Tu alloues mat2, puis mat1 et tu rattaches mat1->mat à mat2. C'est parfait. Seul problème, tu désalloues mat2, donc mat1.mat pointe sur une zone non allouée. Erreur de segmentation assurée si tu cherches à écrire dessus.
Tu alloues mat2, puis mat1 et tu rattaches mat1->mat à mat2. C'est parfait. Seul problème, tu désalloues mat2, donc mat1.mat pointe sur une zone non allouée. Erreur de segmentation assurée si tu cherches à écrire dessus.
Effectievment, la désallocation est nécessaire. Mais faut pas le faire dans la fonction allocation, sinon cette dernière ne sert à rien. Il faut que tu te crées une fonction desalloc() qui prendra en argument ta structure img allouée.
Ensuite, niveau assemblage, tu appelles structure=alloc() dans le main() pour utiliser ta structure, et lorsque tu as fini de l'utiliser tu appelles desalloc(structure);
Ensuite, niveau assemblage, tu appelles structure=alloc() dans le main() pour utiliser ta structure, et lorsque tu as fini de l'utiliser tu appelles desalloc(structure);