bonjour !

je suis en train de manipuler des listes et des piles. Voici les strucutres correspondante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
typedef struct
{
        char* nomElt; //nom de l'élément
        TYPE typeElt; //nom du type de l'elt
        union
        {
                int val_INT;
                boolean val_BOOL;
                char val_CHAR;
        };//valeur  de l'elt ; un de ces trois champs sera renseigne selon le type de l'elt
        struct stListSymbole * next; //chainage vers le suivant dans la liste
} stListSymbole;
 
//structure definissant la pile des tables des symboles
//les operations "depiler" et "empiler" sont effectuees par les fonctions "creerTds" //et "supprimeTds"
struct stPileTableSymbole {
 
        int nbTables; //le nombre de table dans la pile
        struct stEltPile *tableActive; //le sommet de la pile
};
 
//structure definissant un element de la pile
struct stEltPile {
 
        struct stEltPile* suivant;//la table suivante (en dessous) dans la pile
        stListSymbole *table;//l'element de la pile en lui meme repesente par sa tete de liste
};
 
void initPileTable(); //initialise la pile de table des symboles lors de la toute //premiere utilisation
struct stPileTableSymbole pileTable; //la pile en elle meme
 
stListSymbole* ajoutSymbole (char * nom); //ajoute un symbole dans la table //active ; renvoie un pointeur sur la nouvelle tete de liste
                                                        //ou NULL en cas d'echec.
stListSymbole* existeSymbole (stListSymbole *liste, char * ident); //parcours la //table des symboles passee en parametre et 
                                                //si un elt de nom "ident" s'y trouve deja renvoie un //pointeur decu, NULL sinon.
voici le code qui me donne du fil a retordre :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
stListSymbole * ajoutSymbole(char * nom)
{
        printf("1) dans ajout symb-> ancienne tête = %s\n",(pileTable.tableActive)->table->nomElt);
        stListSymbole * ptrNewElt;
        ptrNewElt = (stListSymbole *) malloc(sizeof(stListSymbole));
        if(ptrNewElt == NULL)
                return NULL;
 
        memset(ptrNewElt,0,sizeof(stListSymbole));
 
        printf("2) dans ajout symb-> ancienne tête = %s\n",(pileTable.tableActive)->table->nomElt);
 
        ptrNewElt->nomElt = strdup(nom);
        ptrNewElt->typeElt = INT;
 
        printf("3) dans ajout symb-> ancienne tête = %s\n",(pileTable.tableActive)->table->nomElt);
 
        ptrNewElt->next = (struct stListSymbole*)(pileTable.tableActive)->table;//on chaine le nouvel elt au reste de la liste 
        (pileTable.tableActive)->table = ptrNewElt; //on met a jour la tete de liste sur le nouvel elt
 
        printf("dans ajout symb-> nouv tête = %s\n",(pileTable.tableActive)->table->nomElt);
        printf("dans ajour symbole ->précédent = %s\n",((stListSymbole*)ptrNewElt->next)->nomElt);
        return ptrNewElt;
}
ce qui se passe c'est qu'au 1) et 2), j'ai (pileTable.tableActive)->table->nomElt qui est à null, ce qui est normal.
mais au 3), il devient égale à "nom" ! alors que je n'ai pas encore chainé ptrNewElt à (pileTable.tableActive)->table !
je ne comprend pas ce comportement, pouvez vous m'aider ?

Ardeciel