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 :

Pourquoi ce code plante (segmentation fault)


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 47
    Points : 36
    Points
    36
    Par défaut Pourquoi ce code plante (segmentation fault)
    Bonjour à tous,

    Qqun peut-il m'expliquer pourquoi ce code donne un segmentation fault à l'exécution ?

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "structure.h"
     
    int main(int argc, char *argv[]) {
    	Coordonnees *pointeur = NULL;
    	Volume musique = MOYEN;
     
    	pointeur->x = 7;
    	pointeur->y = 35;
     
    	printf("pointeur : x=%d , y=%d\n",pointeur->x,pointeur->y);
     
    	if (musique == MOYEN) {
    		printf("Le volume de la musique est moyen\n");
    	}
     
    	return 0;
    }
    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
     
    #ifndef STRUCTURE_H_
    #define STRUCTURE_H_
     
    typedef struct Coordonnees Coordonnees;
    struct Coordonnees {
        int x;
        int y;
    };
     
    typedef enum Volume Volume;
    enum Volume {
        FAIBLE, MOYEN, FORT
    };
     
    #endif
    Merci

  2. #2
    Membre actif Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Points : 223
    Points
    223
    Par défaut
    Bonjour,
    Dans le main() vous faites:
    pointeur->x = 7;
    pointeur->y = 35;
    Alors que vous avez précédemment fait:
    Coordonnees *pointeur = NULL;
    Le pointeur "pointeur" ne pointe donc sur "rien", ainsi il ne pointe pas sur une zone capable d'acceuillir les champs x et y.
    Le mieux dans ce type de cas simples est de ne surtout pas utiliser les pointeurs qui ici ne sont d'aucune utilité, mais d'utiliser la structure "normale":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Coordonnees pointeur = NULL;
    L'accès aux champs se fait alors par "."

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Coordonnees pointeur = NULL;
    L'initialisation est alors incorrecte, pointeur n'est plus un pointeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Coordonnees pointeur = {0,0};
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Membre actif Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Points : 223
    Points
    223
    Par défaut
    Euh oui,
    J'ai fait un copié collé et j'ai oublié de modifier cela, je pense qu'il n'est même pas la peine d'initialiser à 0, dans le cas où l'on est, on peut sans doute directement faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Coordonnees pointeur = {7,35};

Discussions similaires

  1. [PostgreSQL] SQL DB_query Segmentation fault dans code PHP
    Par diabli73 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/11/2008, 12h59
  2. [Débutant] Pourquoi ce code plante-t-il ?
    Par SCalc dans le forum Assembleur
    Réponses: 5
    Dernier message: 31/07/2008, 11h40
  3. [Conception] Pourquoi ce code plante ?
    Par bilou95 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 09/10/2007, 10h52
  4. pourquoi 'segmentation fault'?
    Par thepinguin dans le forum C
    Réponses: 25
    Dernier message: 21/11/2006, 22h23
  5. Segmentation fault : pourquoi ?
    Par Dan_coyle dans le forum C
    Réponses: 5
    Dernier message: 23/04/2006, 20h26

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