Rechercher : dans
Par :

Probleme C : Structure et fonction FREE

Dernière réponse le 11 jan 2009 à 20:07:44 sEik, le 11 jan 2009 à 17:46:51 
 Signaler ce message aux modérateurs

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 :)

Configuration: Windows Vista
Firefox 3.0.5

Meilleures réponses pour « Probleme C : Structure et fonction FREE » dans :
Les piles en langage C VoirLes piles Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la pile IV. Opérations sur les piles A. Initialisation B. Insertion d'un élément dans la pile C. Ôter un élément de la pile D. Affichage...
Les files en langage C VoirLes files - Premier Entré Premier Sorti Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la file IV. Opérations sur les files A. Initialisation B. Insertion d'un élément dans la file C. Oter un...
Les templates en C++ VoirIntroduction Avantages Inconvénients Quand utiliser des templates ? Que dois-je mettre dans les .hpp et dans les .cpp ? Convention de notations Quelques templates célèbres STL BGL Premiers pas Spécifications de templates Template par...
Langage C++ - Les fonctions VoirLa notion de fonction On appelle fonction un sous-programme qui permet d'effectuer un ensemble d'instructions par simple appel de la fonction dans le corps du programme principal. Les fonctions permettent d'exécuter dans plusieurs parties du...
Langage C - Les fonctions VoirLa notion de fonction On appelle fonction un sous-programme qui permet d'effectuer un ensemble d'instructions par simple appel de la fonction dans le corps du programme principal. Les fonctions permettent d'exécuter dans plusieurs parties du...
Les structures en langage C VoirDifférence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de...

1

toto, le 11 jan 2009 à 17:56:01

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.

Répondre à toto

2

sEik, le 11 jan 2009 à 18:50:50

Merci pour la réponse :).
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 ?

Répondre à sEik

3

tatou_38, le 11 jan 2009 à 19:03:55

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 );


tatou_38

Répondre à tatou_38

5

toto, le 11 jan 2009 à 19:16:53

SEik veut désallouer un élève individuellement. Il ne peut pas faire une seule allocation globale et un seul free.

Répondre à toto

4

toto, le 11 jan 2009 à 19:14:19

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 !

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));

Répondre à toto

6

sEik, le 11 jan 2009 à 19:34:32

C'est bon ça fonctionne parfaitement.
Merci pour votre aide et bonne continuation :).

Répondre à sEik

7

 lami20j, le 11 jan 2009 à 20:07:44

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.
106485010510997108

Répondre à lami20j
Collection CommentÇaMarche.net