IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Erreur de segmentation


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Par défaut Erreur de segmentation
    Bonsoir, je travaille sur les listes chainées pour un projet( ici il s'agit d'ajouter un element de type Cave dans une liste) et ca fait des heures ke je tourne en rond à cause d'une erreure que me donne le compilateur lors de l'éxécution du fichier ajouterVin2.c dont l'éxécutable est ajouter2:
    "4 [main] ajouter2 5820_cygtls:: handle_exceptions:Error while dumping state[probably corrupted stack]
    Segmentation fault(core dumped)"

    En faite je travail sous windows avec cygwin. Et merci d'avance pour votre aide.

    voici le code:

    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
    //fichier vin2.h
    struct Vin  
    {
    	char region[16];
    	char domaine[20];//domaine de cultivation(lieu)
    	char chateau[20];//ex:Bordeaux
    	char couleur[15];
    	int annee;
    	char cepage[12];//d�crit la vari�t� de plante de la vigne utilis�e pour produire le vin
    	int taille;
    	int nbBouteilles;
    	int anneeMat;//l'ann�e de maturit�
    	char localisation[4];//dans la cave
    	char commentaires[70];		
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //fichier cave2.h
    typedef struct Cave *pCave;
     
    struct Cave  
    {	
    	struct Vin *carac;//les caractéristiques du vin
    	struct Cave *suivant;
     
    };
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    //fichier ajouterVin2.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "vin2.h"
    #include "cave2.h"
     
     
    /**********************************************
    La fonction int ajouterVin(pvin nom) renverra 0 si l'ajout du vin dans 
    la liste chainee se fera sans aucune erreur et 1 sinon.
    *********************************************************/
     
    int ajouterVin(pCave vin,pCave tete)
    {
    	pCave nouveau;
    	pCave courant;
    	char *res;
     
     
    	if(tete==NULL)//la liste est vide, c'est donc le premier vin qui est ajouté
    	{	
    		printf("Debut:1\n");
    		nouveau=(pCave)malloc(sizeof(struct Cave));//alloue la mémoire nécessaire au nouveau maillon de la liste
     
    		if(nouveau==NULL)
    		{	printf("Erreure s'est produite lors de l'allocation dynamique de la mémoire dans l'ajout\n");
    			return 1;
     
    		}		
    		else
    		{	
    			nouveau->suivant=tete;//la tete est assigné au maillon suivant ici null car la liste est vide
    			tete=nouveau;
    			printf("Debut:1\n");
    		}
    	}
     
    	else//la liste contient au moins 1 element
    	{
    		courant=tete;
     
    		if(courant->suivant!=NULL) //parcours de la liste chaînée jusqu'au dernier maillon 
    		{	
    			courant=courant->suivant;
     
    		}
     
    		nouveau=(pCave)malloc(sizeof(struct Cave));//alloue la mémoire nécessaire au nouveau maillon de la liste
     
    		if(nouveau==NULL)
    		{	printf("Erreure s'est produite lors de l'allocation dynamique de la mémoire dans l'ajout\n");
    			return 1;
    		}
    		else
    		{
    			printf("Debut:1\n");
    			courant->suivant=nouveau;
    			printf("Debut:1\n");
    			nouveau->suivant=NULL;
     
    		}
    	}
     
    	//insertion des caractéristiques du vin dans l'élément nouveau
    	res=strcpy(nouveau->carac->region,vin->carac->region);
    	res=strcpy(nouveau->carac->domaine,vin->carac->domaine);
    	res=strcpy(nouveau->carac->chateau,vin->carac->chateau);
    	res=strcpy(nouveau->carac->couleur,vin->carac->couleur);
    	nouveau->carac->annee=vin->carac->annee;
    	res=strcpy(nouveau->carac->cepage,vin->carac->cepage);
    	nouveau->carac->taille=vin->carac->taille;	
     
    	free(nouveau);
     
    	return 0;
     
    }
     
    int main()
    {
    	char *res;
    	pCave vin1;
    	//pCave vin2;
    	pCave tete;
    	tete=NULL;
    	printf("Debut:1\n");
    	res=strcpy(vin1->carac->region,"Bordeaux");
    	res=strcpy(vin1->carac->domaine,"domaine familial");
    	res=strcpy(vin1->carac->chateau,"Bordeaux Côtes de francs");
    	res=strcpy(vin1->carac->couleur,"Rouge");
    	vin1->carac->annee=1993;
    	res=strcpy(vin1->carac->cepage,"merlot");
    	vin1->carac->taille=2;	
    	vin1->carac->nbBouteilles=10;
    	vin1->carac->anneeMat=10;
    	res=strcpy(vin1->carac->localisation,"3C");
    	printf("fin\n");
    	res=strcpy(vin1->carac->commentaires,"lalalalallala");
     
    	if((ajouterVin(vin1,tete))!=0)
    		printf("Erreur lors de l'insertion d'un vin\n");
    	else
    		printf("Succes de l'ajout du vin\n");
     
                 return 0;
    }

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Dans le code ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	pCave vin1;
    	//pCave vin2;
    	pCave tete;
    	tete=NULL;
    	printf("Debut:1\n");
    	res=strcpy(vin1->carac->region,"Bordeaux");
    La variable vin1 est en fait un pointeur (mauvaise idée que de masquer ce fait comme tu l'as fait ici) qui ne contient pas une adresse valide. L'appel à strcpy() va donc écrire n'importe où en mémoire,d'où le problème.

    Ceci étant un compilateur correctement configuré signale le problème:

    ||=== test_DVP, Release ===|
    E:\projet\test_DVP\main.c|81|warning: function declaration isn't a prototype|
    E:\projet\test_DVP\main.c||In function `main'
    E:\projet\test_DVP\main.c|83|warning: 'vin1' might be used uninitialized in this function|
    ||=== Build finished: 0 errors, 2 warnings ===|

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Par défaut dsl pour la non indentation du code, mais c a cause du mini editeur
    voici le code:

    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
    //fichier vin2.h
    struct Vin 
    {
         char region[16];
         char domaine[20];//domaine de cultivation(lieu)
         char chateau[20];//ex:Bordeaux
         char couleur[15];
         int annee;
         char cepage[12];//d�crit la vari�t� de plante de la vigne utilis�e pour produire le vin
         int taille;
         int nbBouteilles;
         int anneeMat;//l'ann�e de maturit�
         char localisation[4];//dans la cave
         char commentaires[70]; 
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //fichier cave2.h
    typedef struct Cave *pCave;
     
    struct Cave 
    { 
         struct Vin *carac;//les caractéristiques du vin
         struct Cave *suivant;
     
    };
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    //fichier ajouterVin2.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "vin2.h"
    #include "cave2.h"
     
     
    /**********************************************
    La fonction int ajouterVin(pCave vin,pCave tete) renverra 0 si l'ajout du vin dans la liste chainee se fera sans aucune erreur et 1 sinon.
    *********************************************************/
     
    int ajouterVin(pCave vin,pCave tete)
    {
        pCave nouveau;
        pCave courant;
        char *res;
     
     
        if(tete==NULL)//la liste est vide, c'est donc le premier vin qui est ajouté
        { 
           nouveau=(pCave)malloc(sizeof(struct Cave));//alloue la mémoire   nécessaire au nouveau maillon de la liste
     
           if(nouveau==NULL)
          {   printf("Erreure s'est produite lors de l'allocation dynamique de la mémoire dans l'ajout\n");
              return 1;
     
           } 
           else
           { 
              nouveau->suivant=tete;//la tete est assigné au maillon suivant ici null car la liste est vide
              tete=nouveau;
            }
        }//fin if
     
        else//la liste contient au moins 1 element
        {
            courant=tete;
     
            if(courant->suivant!=NULL) //parcours de la liste chaînée jusqu'au dernier maillon 
            { 
                courant=courant->suivant;
     
             }
     
             nouveau=(pCave)malloc(sizeof(struct Cave));//alloue la mémoire      nécessaire au nouveau maillon de la liste
     
            if(nouveau==NULL)
           {    printf("Erreure s'est produite lors de l'allocation dynamique de la mémoire dans l'ajout\n");
                 return 1;
            }
            else
           {
                printf("Debut:1\n");
                courant->suivant=nouveau;
                printf("Debut:1\n");
                nouveau->suivant=NULL;
     
             }
       }//fin du else
     
    //insertion des caractéristiques du vin dans l'élément nouveau
       res=strcpy(nouveau->carac->region,vin->carac->region);
       res=strcpy(nouveau->carac->domaine,vin->carac->domaine);
       res=strcpy(nouveau->carac->chateau,vin->carac->chateau);
       res=strcpy(nouveau->carac->couleur,vin->carac->couleur);
       nouveau->carac->annee=vin->carac->annee;
       res=strcpy(nouveau->carac->cepage,vin->carac->cepage);
       nouveau->carac->taille=vin->carac->taille; 
     
       free(nouveau);
     
       return 0;
     
    }
     
    int main()
    {
    char *res;
    pCave vin1;
    pCave tete;
    tete=NULL;
    res=strcpy(vin1->carac->region,"Bordeaux");
    res=strcpy(vin1->carac->domaine,"domaine familial");
    res=strcpy(vin1->carac->chateau,"Bordeaux Côtes de francs");
    res=strcpy(vin1->carac->couleur,"Rouge");
    vin1->carac->annee=1993;
    res=strcpy(vin1->carac->cepage,"merlot");
    vin1->carac->taille=2; 
    vin1->carac->nbBouteilles=10;
    vin1->carac->anneeMat=10;
    res=strcpy(vin1->carac->localisation,"3C");
    res=strcpy(vin1->carac->commentaires,"lalalalallala");
     
    if((ajouterVin(vin1,tete))!=0)
       printf("Erreur lors de l'insertion d'un vin\n");
    else
       printf("Succes de l'ajout du vin\n");
     
    return 0;
    }

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Par défaut
    merci pour ta réponse.
    Que devrais-je faire exactement pour remédier à ce probléme????

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Par défaut
    voila j'ai modifié le code de sorte que les pointeurs ne soient plus masqués, mais ca me donne tjrs la mm erreur.

    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
    //fichier vin2.h
     
    struct Vin  
    {
    	char region[16];
    	char domaine[20];//domaine de cultivation(lieu)
    	char chateau[20];//ex:Bordeaux
    	char couleur[15];
    	int annee;
    	char cepage[12];//d�crit la vari�t� de plante de la vigne utilis�e pour produire le vin
    	int taille;
    	int nbBouteilles;
    	int anneeMat;//l'ann�e de maturit�
    	char localisation[4];//dans la cave
    	char commentaires[70];	
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //fichier cave2.h
    struct Cave  
    {	
    	struct Vin *carac;//les caractéristiques du vin
    	struct Cave *suivant;
     
    };
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    //fichier ajouterVin2.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "vin2.h"
    #include "cave2.h"
     
     
    /**********************************************
    La fonction int ajouterVin(pvin nom) renverra 0 si l'ajout du vin dans 
    la liste chainee se fera sans aucune erreur et 1 sinon.
    *********************************************************/
     
    int ajouterVin(struct Cave *vin,struct Cave *tete)
    {
    	struct Cave *nouveau;
    	struct Cave *courant;
    	char *res;
     
     
    	if(tete==NULL)//la liste est vide, c'est donc le premier vin qui est ajouté
    	{	
    		printf("Debut:1\n");
    		nouveau=(struct Cave*)malloc(sizeof(struct Cave));//alloue la mémoire nécessaire au nouveau maillon de la liste
     
    		if(nouveau==NULL)
    		{	printf("Erreure s'est produite lors de l'allocation dynamique de la mémoire dans l'ajout\n");
    			return 1;
     
    		}		
    		else
    		{	
    			nouveau->suivant=tete;//la tete est assigné au maillon suivant ici null car la liste est vide
    			tete=nouveau;
    			printf("Debut:1\n");
    		}
    	}
     
    	else//la liste contient au moins 1 element
    	{
    		courant=tete;
     
    		if(courant->suivant!=NULL) //parcours de la liste chaînée jusqu'au dernier maillon 
    		{	
    			courant=courant->suivant;
     
    		}
     
    		nouveau=(struct Cave*)malloc(sizeof(struct Cave));//alloue la mémoire nécessaire au nouveau maillon de la liste
     
    		if(nouveau==NULL)
    		{	printf("Erreure s'est produite lors de l'allocation dynamique de la mémoire dans l'ajout\n");
    			return 1;
    		}
    		else
    		{
    			printf("Debut:1\n");
    			courant->suivant=nouveau;
    			printf("Debut:1\n");
    			nouveau->suivant=NULL;
     
    		}
    	}
     
    	//insertion des caractéristiques du vin dans l'élément nouveau
    	res=strcpy(nouveau->carac->region,vin->carac->region);
    	res=strcpy(nouveau->carac->domaine,vin->carac->domaine);
    	res=strcpy(nouveau->carac->chateau,vin->carac->chateau);
    	res=strcpy(nouveau->carac->couleur,vin->carac->couleur);
    	nouveau->carac->annee=vin->carac->annee;
    	res=strcpy(nouveau->carac->cepage,vin->carac->cepage);
    	nouveau->carac->taille=vin->carac->taille;	
     
    	free(nouveau);
     
    	return 0;
     
    }
     
    int main()
    {
    	char *res;
    	struct Cave *vin1;
     
    	/*voici une ligne que j'ai ajouté*/
    	vin1=(struct Cave*)malloc(sizeof(struct Cave));
     
    	struct Cave *tete;
    	tete=NULL;
    	printf("Debut:1\n");
    	res=strcpy(vin1->carac->region,"Bordeaux");
    	res=strcpy(vin1->carac->domaine,"domaine familial");
    	res=strcpy(vin1->carac->chateau,"Bordeaux Côtes de francs");
    	res=strcpy(vin1->carac->couleur,"Rouge");
    	vin1->carac->annee=1993;
    	res=strcpy(vin1->carac->cepage,"merlot");
    	vin1->carac->taille=2;	
    	vin1->carac->nbBouteilles=10;
    	vin1->carac->anneeMat=10;
    	res=strcpy(vin1->carac->localisation,"3C");
    	printf("fin\n");
    	res=strcpy(vin1->carac->commentaires,"lalalalallala");
     
    	if((ajouterVin(vin1,tete))!=0)
    		printf("Erreur lors de l'insertion d'un vin\n");
    	else
    		printf("Succes de l'ajout du vin\n");
     
    	return 0;
    }

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par sisinfo Voir le message
    voila j'ai modifié le code de sorte que les pointeurs ne soient plus masqués, mais ca me donne tjrs la mm erreur.
    Le fait ne masquer les pointeurs n'a pas de rapport direct avec le problème, c'est juste qu'il est plus facile pour un relecteur de cerner le problème s'il sait quelles varibles sont des pointeurs.

    Pour ton problème, il y a plusieurs solutions:
    • Utiliser un struct Cave et non un pointeur sur struct Cave.
    • Initialiser le pointeur avec l'adresse d'un struct Cave existant.
    • Allouer dynamiquement la mémoire nécessaire.


    PS : je viens de rajouter les balises CODE dans ton message, merci d'y penser à l'avenir.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Par défaut
    Bonjour, en faite j'avais déjà pensé à allouer dynamiquement vin1, mais ca changeait absolument rien lors de lexecution.


    dans le code du main du fichier ajouterVin2.c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /*voici une ligne que j'ai ajouté*/
    	vin1=(struct Cave*)malloc(sizeof(struct Cave));

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Par défaut ca marche , merci
    Enfin, ca marche , jte remercie beaucoup, en faite j'ai utilisé une struct cave et pas un pointeur comme tu me l'avais suggéré.

  9. #9
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Pense aussi que ta structure cave contient 2 pointeurs qui vont eux aussi pointer n'inporte où.

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo