Probleme C : Structure et fonction FREE
Fermé
sEik
-
11 janv. 2009 à 17:46
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 11 janv. 2009 à 20:07
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 11 janv. 2009 à 20:07
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.
tatou_38
Messages postés
1928
Date d'inscription
vendredi 21 avril 2006
Statut
Membre
Dernière intervention
5 août 2015
121
11 janv. 2009 à 19:03
11 janv. 2009 à 19:03
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));
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
11 janv. 2009 à 20:07
11 janv. 2009 à 20:07
Salut,
Pourquoi pas utilisé une liste au lieu de tableau ?
En général quand il s'agit des manipulations de genre ajout/suppression, les listes chaînées sont préférables aux tableaux.
Pourquoi pas utilisé une liste au lieu de tableau ?
En général quand il s'agit des manipulations de genre ajout/suppression, les listes chaînées sont préférables aux tableaux.
11 janv. 2009 à 18:50
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 ?