Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : tableau de liste [ Divers / Débutant(e) ] (kenikun)

dimanche 18 mai 2008 à 16:31:30 | tableau de liste

kenikun

Bonjour,
J'ai un programme en C avec une liste chainee simple dont voici la declaration :
[code]
typedef struct Element_
{
    int map;
    char val[4];
    struct Element_ * suivant;
}Element;
[/code]

Pour les besoins de mon application, je cree ensuite un tableau de liste.
[code]
Element * tab = (Element*)malloc(sizeof(Element)*76);
[/code]
Le tableau est initialisé avec tous les map à  0, val à  "" et suivant à  NULL. Ensuite je remplis le tableau. Par exemple je peux avoir quelque chose du genre:

Case 0: val="abc\0" map=1 , suivant=NULL
.....
...
case 76: val="etc\0" map=5, suivant:val="epu\0" map=1, suivant=NULL

Mon programme fonctionne correctement et fait bien ce que je veux. Mais je rencontre un probleme lorsque je vais liberer l'espace alloué pour le tableau de liste. J'ai pensé à  faire une fonction qui permet de liberer une case et ensuite faire une boucle pour liberer toutes les autres.

int liberer(Element* p)
{
    Element *tmp;
    while(p)
    {
    tmp=p->suivant;
    free(p);
    p=tmp;
    }
    return 0;
}
Vu que je veux faire une modification, je passe en parametre un pointeur sur la case et j'appelle la fonction avec l'adresse de la case. Par exemple : liberer(&tab[0]);
Jusque là  tout va bien (enfin pour la premiere case), mais dès que je veux passer à  la case suivante, j'ai un SIGSEGV. J'ai regardé dans le debogueur et j'ai cette information : ***glibc detected *** /home/seb/appli/debug/src/appli: free(): invalid pointer: 0x0805e5e4 (c'est l'adresse de la case 1 apres avoir liberé la case 0).

Quelqu'un aurait-il une solution à  mon problème?
Merci


dimanche 18 mai 2008 à 18:23:00 | Re : tableau de liste

chaipo

Salut,

euh si c'est juste libérer la place allouer à ce moment là: "Element * tab = (Element*)malloc(sizeof(Element)*76);" avec malloc, il suffit d'utiliser free.

dimanche 18 mai 2008 à 19:52:29 | Re : tableau de liste

jfrancois

Bonjour,

1) "Pour les besoins de mon application, je cree ensuite un tableau de liste."
Non, c'est juste un tableau de structures et non une liste ou un tableau de listes. Le champ suivant n'a aucune utilité du coup, d'ailleurs il est systématiquement mis à NULL dans le switch d'initialisation. A moins d'imaginer que, par la suite, les éléments du tableau se pointent les uns les autres, comme après un tri !

2) "J'ai pensé à  faire une fonction qui permet de liberer une case et ensuite faire une boucle pour liberer toutes les autres."
Pourquoi ? Les éléments de la liste n'ont pas été alloués, il n'y a donc pas de raison de les désallouer ! Quand la liste est créée, chaque élément occupe déjà sa pleine propre place : 1 entier + 4 caractères + 1 pointeur. Celà ne serait pas le cas (et il faudrait effectivement une boucle de désallocation) si val était un pointeur sur une chaîne de caractères allouée au moment de son initialisation. Une simple libération du tableau suffit.

3) Case 0: val="abc\0" map=1 , suivant=NULL ne va pas du tout !
c'est plutôt : case 0 : strcpy(val,"abc"); map=1; suivant=NULL; break;


Jean-François


dimanche 18 mai 2008 à 20:51:00 | Re : tableau de liste

Edydy

En résumé ce que jfrancois veut te dire c'est que le tu ne peux pas désallouer une case de ton tableau parce que tu as allouer tes 76 éléments d'un coup.

En gros le principe du free c'est une désallocation par malloc :

Tu fais un malloc, tu devras faire un free;
deux malloc, deux free...

Ton code devrait donc être dans ce style la alors pour l'allocation de mémoire et faire une vrai chaine liée,
mais l'inconvénient, c'est que tu ne pourra plus acceder par indice à tes éléments.

Element * tab = NULL;
Element* tmp = NULL;
//premier élément alloué
tab = (Element*)malloc(sizeof(Element));
tmp = tab;
for(int i = 0; i < 74; i++){
   tmp->suivant = (Element*)malloc(sizeof(Element));
   if(!tmp)
      error;
   tmp = tmp->suivant;
}
//dernier élément
   tmp->suivant = (Element*)malloc(sizeof(Element));
   if(!tmp)
      error;
   tmp->suivant = NULL;





Cette discussion est classé dans : liste, tableau, case, element, map


Répondre à ce message

Sujets en rapport avec ce message

Comment recupéré un element d'une liste? [ par Sat83 ] Bonjour!J'ai une liste d'Objet:list canaux;Où Data est une classe...Comment faire pour récupéré le Nième element de cette liste?Comme avec un tableau Cacher un tableau de chiffre par un de caractere [ par RootASM ] Bonjour,Je suis en train de programmer un démineur mais je ne sais pas comment faire pour afficher un tableau de '*' que le joueur verra et ou il entr Bloqué au début de mon algo [ par Darksnakes ] Bonjour tout le monde, je débute en C et voila mon problèmeJ'aimerais faire un programme qui pour un tableauT[0..N] (toutes les cases initialisés à 1) PB tableau [ par petitavion414 ] Bonjour à tousJe vous explique mon problème qui me resiste depuis longtemps :J'ai une classe mère qui s'appelle ouvrages (qui est de plus une abstract Problème avec liste chainée [ par MasterShadows ] Bonjour à tous ,alors voilà dans le cadre de mon tp de C je dois créer une liste simplement chainée tout ce qu'il y'a de plus générique.donc on nous d afficher une grille [ par igloobuster ] salut à tous, j'ai un tableau a deux dimmensions et j'aimerais afficher se tableau dans une fenetre.J'ai pensé à une Listview, mais le probleme est qu Trier une liste chainée [ par ango973 ] Bonjour,J'ai un probleme avec une fonction qui doit me trier une liste chainée selon le nom mais apres le passage dans ma fonction la liste reste iden tri par insertion dans une liste chaînée [ par titi4659 ] Bonjour,j'ai un problème avec une liste chaînée.j'ai une liste d'element que j'arrive a récupéré mais je souhaiterai que lorsque je récupère un elemen SDL [ par lushkah ] bjr, j'ai un pb avec la SDL  en C, je débutes et j'ai passer la nuit a essayer de faire une disparition en fondu, j'essayes de programmer un jeu de da Passer un tableau dynamique en paramètre [ par freepouy18 ] Salut tlm! J'aimerais savoir si je peux ou non passer en paramètre un tableau dynamique  dont je n'ai pas encore alloué de mémoire(allocation à l'inté


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,374 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.