/!\ Écrasement d'adresse
Résolu/Fermé
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
-
17 juil. 2014 à 11:34
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 19 juil. 2014 à 21:28
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 19 juil. 2014 à 21:28
A voir également:
- /!\ Écrasement d'adresse
- Rechercher ou entrer l'adresse - Guide
- Darkino nouvelle adresse - Guide
- Darkino : le grand site pirate change d'adresse et d'interface - Accueil - Services en ligne
- Adresse mac - Guide
- Créer une adresse hotmail - Guide
3 réponses
Utilisateur anonyme
Modifié par le père. le 17/07/2014 à 11:50
Modifié par le père. le 17/07/2014 à 11:50
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à.
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
49
18 juil. 2014 à 12:55
18 juil. 2014 à 12:55
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 ); }
Utilisateur anonyme
18 juil. 2014 à 14:22
18 juil. 2014 à 14:22
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.
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
49
18 juil. 2014 à 14:28
18 juil. 2014 à 14:28
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 -_-
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
18 juil. 2014 à 23:46
18 juil. 2014 à 23:46
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é.
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
49
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
19 juil. 2014 à 21:24
19 juil. 2014 à 21:24
Oui, sauf que
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
49
>
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
19 juil. 2014 à 21:28
19 juil. 2014 à 21:28
Oui, effectivement sauf que j'ai utilisé un compilateur online ,quant au variable ben c'est plus une signature mais bon tu a raison ;-)
Modifié par sambia39 le 17/07/2014 à 15:08
je porte les modifications sur la source ce soir et je reposterais le résultat,
merci voisin & (+1)
à bientôt