/!\ É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
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


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




3 réponses

Bonjour voisin

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à.
2
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
Modifié par sambia39 le 17/07/2014 à 15:08
Merci voisin, j'ai également vu ces erreurs d'ailleurs c'est pour ça que j'ai dit que ça marchait pas et j'ai demandé que le poste soit supprimé. En réalité ce qui m'intéresse, c'est le tableau de pointeur qui normalement contient des pointeurs sur les piles ou les adresse de celle-ci et par la suite utilisée le tableau de pointeur avec ces valeurs pour manipuler indirectement la pile.
je porte les modifications sur la source ce soir et je reposterais le résultat,
merci voisin & (+1)
à bientôt
0
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
Salut voisin, comme convenu j'ai apporté des modifications sur ma source précédente pour @zarganomi
à 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 );
}



0
Utilisateur anonyme
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.
0
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
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 -_-
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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 :
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é.
0
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
Oui, sauf que
0
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
Oui, effectivement sauf que j'ai utilisé un compilateur online ,quant au variable ben c'est plus une signature mais bon tu a raison ;-)
0