/!\ Écrasement d'adresse
Résolu
sambia39
Messages postés
610
Date d'inscription
Statut
Membre
Dernière intervention
-
sambia39 Messages postés 610 Date d'inscription Statut Membre Dernière intervention -
sambia39 Messages postés 610 Date d'inscription Statut Membre Dernière intervention -
Bonjour
J'avais posté ce programme ci-dessous pour un exemple en utilisant les tableaux de pointeur mais je pense que je me suis planté quelque part dans l'utilisation de l'adresse des piles. je comptais les utilisé afin d'ajouté directement les valeurs incrémenté dans la pile, mais en réalité j'écrasais juste ces données enfin je pense, si des experts peuvent y prêter attention merci à vous
à bientôt
J'avais posté ce programme ci-dessous pour un exemple en utilisant les tableaux de pointeur mais je pense que je me suis planté quelque part dans l'utilisation de l'adresse des piles. je comptais les utilisé afin d'ajouté directement les valeurs incrémenté dans la pile, mais en réalité j'écrasais juste ces données enfin je pense, si des experts peuvent y prêter attention merci à vous
à bientôt
#include <stdio.h> #include <stdlib.h> /* Macro Bool */ typedef enum{false,true}bool; /*** * Structure Simple d'une Pile ***/ typedef struct _Pile{ unsigned int iVal; struct _Pile *pPrec; }ts_Pile; /*** * Fonction qui initialise * la Pile ***/ bool f_initPile(ts_Pile *pIn){ pIn = NULL; if( pIn != NULL ) return ( false ); return ( true ); } /*** * Fonction qui ajoute un élement * dans la Pile ***/ void f_addPile(ts_Pile **pIn, unsigned int const iVal){ ts_Pile *tmp = malloc( sizeof( ts_Pile* ) ); if( !tmp ){ printf(" Erreur interne d'allocation\n "); exit( 1 ); } /* Ajout de l'élément */ tmp->iVal = iVal; tmp->pPrec = (*pIn); (*pIn) = tmp; } /*** * fonction qui retire un élement * de la Pile ***/ unsigned const int f_PopPile(ts_Pile **pIn){ unsigned int iVal = 0; ts_Pile *tmp = NULL; if( !(*pIn) ) return ( -1 ); tmp = (*pIn)->pPrec; iVal = (*pIn)->iVal; free( *pIn ); *pIn = tmp; return ( iVal ); } /*** * Fonction principale ***/ int main(void) { int i = 0; ts_Pile *pile_1; /* Pile (1) */ ts_Pile *pile_2; /* Pile (2) */ ts_Pile *pile_3; /* Pile (3) */ /* initialisation des Piles */ if( f_initPile( pile_1 ) == false ){ printf("Impossible d'initialiser la pile (1) \n"); exit( 1 ); } /* Pile (2) */ if( f_initPile( pile_2 ) == false ){ printf("Impossible d'initialiser la pile (2) \n"); exit( 1 ); } /* Pile (3) */ if( f_initPile( pile_3 ) == false ){ printf("Impossible d'initialiser la pile (3) \n"); exit( 1 ); } /* Tableau Pointeur de Pile */ ts_Pile (*pTabAddr[3]) = { &pile_1, &pile_2, &pile_3}; /* Ajout des nouvelle valeurs aux Pile*/ for (i = 0; i < 20 ;i++ ){ f_addPile( pTabAddr[0], i ); f_addPile( pTabAddr[1], (i*2) ); f_addPile( pTabAddr[2], (i*4) ); } printf("\n\t==========\tPile (1)\t==========\n"); for( i = 0; i < 20 ; i++) printf("\t\t\tPop (1) = %d\n",f_PopPile( &pTabAddr[0] ) ); printf("\n\t==========\tPile (2)\t==========\n"); /* Nouvelle affichage Pile (2) */ for( i = 0; i < 20 ; i++) printf("\t\t\tPop (2) = %d\n",f_PopPile( &pTabAddr[1] ) ); printf("\n\t==========\tPile (3)\t==========\n"); /* Nouvelle affichage Pile (3) */ for( i = 0; i < 20 ; i++) printf("\t\t\tPop (3) = %d\n",f_PopPile( &pTabAddr[2] ) ); return ( 0 ); }
A voir également:
- /!\ Écrasement d'adresse
- Darkino nouvelle adresse - Guide
- Adresse mac - Guide
- Changer adresse dns - Guide
- Adresse url - Guide
- Comment connaître son adresse ip - Guide
3 réponses
Bonjour voisin
Je n'ai pas lu très loin, car trop de choses choquantes dès le départ :
À quoi bon tester la valeur de pIn, alors que tu viens juste d'initialiser cette valeur ?
De plus, tu ne modifies ici que la variable locale à la fonction : quand tu appelles plus loin f_initPile( pile_1 ), pile_1 n'est PAS modifié.
ts_Pile *tmp = malloc( sizeof( ts_Pile* ) ); Si tu veux que tmp pointe sur un ts_Pile, la taille allouée doit être celle de ts_Pile, pas celle de ts_Pile * !
J'ai arrêté là.
Je n'ai pas lu très loin, car trop de choses choquantes dès le départ :
pIn = NULL; if( pIn != NULL )
À quoi bon tester la valeur de pIn, alors que tu viens juste d'initialiser cette valeur ?
De plus, tu ne modifies ici que la variable locale à la fonction : quand tu appelles plus loin f_initPile( pile_1 ), pile_1 n'est PAS modifié.
ts_Pile *tmp = malloc( sizeof( ts_Pile* ) ); Si tu veux que tmp pointe sur un ts_Pile, la taille allouée doit être celle de ts_Pile, pas celle de ts_Pile * !
J'ai arrêté là.
Salut voisin, comme convenu j'ai apporté des modifications sur ma source précédente pour @zarganomi
à bientôt et merci encore
à bientôt et merci encore
#include <stdio.h> #include <stdlib.h> /* Macro Bool */ typedef enum{false,true}bool; /*** * Structure Simple d'une Pile ***/ typedef struct _Pile{ unsigned int iVal; struct _Pile *pPrec; }ts_Pile; /*** * Fonction vérification * de la pile ***/ bool f_isEmpty(ts_Pile **pIn){ return ( (*pIn == NULL ) ? true : false ); } /*** * Fonction qui ajoute un élement * dans la Pile ***/ void f_addPile(ts_Pile **pIn, unsigned int const iVal){ ts_Pile *tmp = malloc( sizeof( ts_Pile ) ); if( !tmp ){ perror( "Erreur interne d'allocation\n" ); exit( 1 ); } /* Ajout de l'élément */ tmp->iVal = iVal; tmp->pPrec = *pIn; *pIn = tmp; } /*** * fonction qui retire un élement * de la Pile ***/ unsigned const int f_PopPile(ts_Pile **pIn){ unsigned int iVal = 0; ts_Pile *tmp = NULL; if( !*pIn ) return ( -1 ); tmp = (*pIn)->pPrec; iVal = (*pIn)->iVal; free( *pIn ); *pIn = tmp; return ( iVal ); } /*** * Fonction qui libère * la mémoire allouer ***/ void f_FreeAlloc( ts_Pile **pIn){ ts_Pile *tmp = NULL; if( f_isEmpty( pIn ) != true ){ while( *pIn ){ tmp = (*pIn)->pPrec; free ( *pIn ); *pIn = tmp; } *pIn = NULL; tmp = NULL; } } /*** * Fonction principale ***/ int main( void ) { int i = 0; /* Déclaration des piles & initialisation */ ts_Pile *pile_1 = NULL; /* Pile (1) */ ts_Pile *pile_2 = NULL; /* Pile (2) */ ts_Pile *pile_3 = NULL; /* Pile (3) */ /* tableau de Pointeur */ ts_Pile (*pTabAddr[3]) = { &pile_1, &pile_2, &pile_3 }; /* Ajouts des valeurs à la pile */ for(; i < 20 ; i++){ f_addPile( pTabAddr[0], i ); f_addPile( pTabAddr[1], (i*2) ); f_addPile( pTabAddr[2], (i*4) ); } /* Affichage des Piles */ for(i = 0; i < 20 ; i++) printf("Pile (1)\t= %d\n", f_PopPile(&pile_1) ); for(i = 0; i < 20 ; i++) printf("Pile (2)\t= %d\n", f_PopPile(&pile_2) ); for(i = 0; i < 20 ; i++) printf("Pile (3)\t= %d\n", f_PopPile(&pile_3) ); /* Désalocation mémoire */ f_FreeAlloc( pTabAddr[0] ); f_FreeAlloc( pTabAddr[1] ); f_FreeAlloc( pTabAddr[2] ); return ( 0 ); }
ts_Pile (*pTabAddr[3]) = { &pile_1, &pile_2, &pile_3 };
Il ne se plaint pas sur cette ligne, ton compilateur ? Il est trop laxiste, il y a une erreur de type que le mien me signale :
ts_Pile **pTabAddr[3] = { &pile_1, &pile_2, &pile_3 };
est bien mieux.
Je n'ai pas de compilateur sur le pc que j'utilise actuellement, j'ai donc utilisé un éditeur en ligne dont le lien est le suivant https://ideone.com/X8YXlg
et bien entendu il me dit que tout va bien -_-
et bien entendu il me dit que tout va bien -_-
Bonjour,
Effectivement, il y a une erreur...
ts_Pile (*pTabAddr[3]) = { &pile_1, &pile_2, &pile_3 };
si ton compilateur ne crie pas avec ça, il faut en changer... Ou alors mieux le régler...
pile_1 est un pointeur, donc &pile_1 est un double pointeur. Il vaut donc ts_pile **pTabAddr[3] comme l'indique le père.
D'ailleurs, tu n'as même pas besoin de préciser la taille du tableau :
De plus, attention à tes noms de variable. En C (contrairement à d'autres langages), ce n'est pas très conseillé de commencer par un underscore. Enfin rien d'interdit. En revanche, underscore suivi d'une majuscule comme dans _Pile n'est pas autorisé.
Effectivement, il y a une erreur...
ts_Pile (*pTabAddr[3]) = { &pile_1, &pile_2, &pile_3 };
si ton compilateur ne crie pas avec ça, il faut en changer... Ou alors mieux le régler...
pile_1 est un pointeur, donc &pile_1 est un double pointeur. Il vaut donc ts_pile **pTabAddr[3] comme l'indique le père.
D'ailleurs, tu n'as même pas besoin de préciser la taille du tableau :
ts_Pile **pTabAddr[] ={&pile_1, &pile_2, &pile_3};
De plus, attention à tes noms de variable. En C (contrairement à d'autres langages), ce n'est pas très conseillé de commencer par un underscore. Enfin rien d'interdit. En revanche, underscore suivi d'une majuscule comme dans _Pile n'est pas autorisé.
je porte les modifications sur la source ce soir et je reposterais le résultat,
merci voisin & (+1)
à bientôt