Probleme C : Structure et fonction FREE
sEik
-
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité -
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité -
Bonjour,
Voila je suis débutant en langage C et j'aimerais libérer une case mémoire a l'aide de la fonction FREE.
J'ai donc une structure qui comporte le nom et l'age d'une personne, voici le programme:
#include "stdio.h"
#include "malloc.h"
struct personne
{
int age;
char nom[10];
};
personne *eleves;
int i;
void main()
{
eleves = (struct personne *) malloc (10 * sizeof(struct personne));
for (i=0;i<4;i++)
{
printf("nom de l'edutiant:");
scanf("%s",&eleves[i].nom);
printf("age de l'edutiant:");
scanf("%d",&eleves[i].age);
}
// free(eleves[3]); comment faire ??
}
le problème est : par exemple si je veux supprimer l'élève N°3, comment faire pour libérer la case memoire dans laquelle il était ?
Merci :)
Voila je suis débutant en langage C et j'aimerais libérer une case mémoire a l'aide de la fonction FREE.
J'ai donc une structure qui comporte le nom et l'age d'une personne, voici le programme:
#include "stdio.h"
#include "malloc.h"
struct personne
{
int age;
char nom[10];
};
personne *eleves;
int i;
void main()
{
eleves = (struct personne *) malloc (10 * sizeof(struct personne));
for (i=0;i<4;i++)
{
printf("nom de l'edutiant:");
scanf("%s",&eleves[i].nom);
printf("age de l'edutiant:");
scanf("%d",&eleves[i].age);
}
// free(eleves[3]); comment faire ??
}
le problème est : par exemple si je veux supprimer l'élève N°3, comment faire pour libérer la case memoire dans laquelle il était ?
Merci :)
4 réponses
Bonjour
Tu ne peux pas. Tu ne peux faire un free de ce qui a été alloué par malloc qu'en une seule fois.
Ça n'est pas tout à fait vrai, en fait tu peux faire un realloc qui va allonger ou réduire la zone réservé, mais pas 'enlever un morceau au milieu'.
Si tu as besoin (mais as-tu besoin ?) de désallouer spécifiquement un élève, il faut définir un tableau de pointeurs et faire 10 malloc, un pour chaque élève. Là, tu pourras faire des free individuels.
Tu ne peux pas. Tu ne peux faire un free de ce qui a été alloué par malloc qu'en une seule fois.
Ça n'est pas tout à fait vrai, en fait tu peux faire un realloc qui va allonger ou réduire la zone réservé, mais pas 'enlever un morceau au milieu'.
Si tu as besoin (mais as-tu besoin ?) de désallouer spécifiquement un élève, il faut définir un tableau de pointeurs et faire 10 malloc, un pour chaque élève. Là, tu pourras faire des free individuels.
Il faut déclarer :
struct personne *eleves;
Puis allouer de la mémoire pour le tableau :
eleves = (struct personne *) malloc (10 * sizeof(struct personne));
après tu peux utiliser le tableau, par exemple : sprintf( "%s" , eleves[6]->nom );
et en fin tu libères la mémoire :
free( eleves );
struct personne *eleves;
Puis allouer de la mémoire pour le tableau :
eleves = (struct personne *) malloc (10 * sizeof(struct personne));
après tu peux utiliser le tableau, par exemple : sprintf( "%s" , eleves[6]->nom );
et en fin tu libères la mémoire :
free( eleves );
Pas tout à fait d'accord (si j'ai bien compris ce que tu cherches à faire)
Pour chaque élève, tu ne devrais allouer qu'une seule structure, pas 10 !
D'autre part, élèves est n tableau de pointeurs sur des personnes.
Donc eleves[i] est un pointeur sur une structure personne.
Donc eleves[i][i] ne veut rien dire : pour que ça veuille dire quelque chose, il faudrait que eleves[i] soit un tableau.
Le nom d'un élève est dans eleves[i]->nom et son age dans eleves[i]->age.
D'où les scanf :
Pour chaque élève, tu ne devrais allouer qu'une seule structure, pas 10 !
eleves[i] = (struct personne *) malloc (sizeof(struct personne));
D'autre part, élèves est n tableau de pointeurs sur des personnes.
Donc eleves[i] est un pointeur sur une structure personne.
Donc eleves[i][i] ne veut rien dire : pour que ça veuille dire quelque chose, il faudrait que eleves[i] soit un tableau.
Le nom d'un élève est dans eleves[i]->nom et son age dans eleves[i]->age.
D'où les scanf :
scanf("%s",eleves[i]->nom);
scanf("%d",&(eleves[i]->age));
j'ai essayé de cette manière alors voila ce que ça donne :
#include "stdio.h"
#include "malloc.h"
struct personne {
int age;
char nom[10];
};
personne *eleves[4];
int i;
void main()
{
for (i=0;i<4;i++)
{
eleves[i] = (struct personne *) malloc (10 * sizeof(struct personne));
}
for (i=0;i<4;i++)
{
printf("nom de l'edutiant:");
scanf("%s",&eleves[i][i].nom);
printf("age de l'edutiant:");
scanf("%d",&eleves[i][i].age);
}
free(eleves[3]);
}
j'aimerais simplement savoir si c'est correct ou pas ?
De ce que j'ai compris j'ai alors créé 4 tableau de taille 10 avec 1 élève par tableau. chaque élève est alors de type personne et comporte un nom et un age.
Mais ce nom et cet age sont dans une seule case du tableau.Donc si je crée 4 tableau de taille 1, est ce que cela va fonctionner ?