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 :

TypeDef Struct & Erreur de segmentation


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 2
    Points : 3
    Points
    3
    Par défaut TypeDef Struct & Erreur de segmentation
    Bonjour, je débute dans le C et je viens d'obtenir aujourd'hui ma première erreur de segmentation.

    Cependant, j'ai beau tenter de réparer le problème mais ça persiste, et le débuggage avec gdb ne m'aide pas.
    Je sais juste que ça bloque entre le "check 1" et le "check 2". Donc je pense que c'est soit l'affectation, soit la fonction creerPlateau qui est incorrecte.

    Je remercie ceux qui auront la patience d'étudier mon problème.

    Contexte : créer un plateau de jeu de n*n cases, puis afficher ce plateau. Dans ce cas, je m'attends à n'obtenir que des 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
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
     
    typedef struct
    {
    	int* tableau;
    	int n;
    } plateau;
     
    /*!
     *      Fonction allouant dynamiquement un plateau dont l’adresse est retournée.
     *
     *      \param n : taille d’un côté
     */
    plateau* creerPlateau(int n)
    {
    	assert(n >= 2 || n <= 8);
    	plateau* new = malloc((n*n+1)*sizeof(int)); // ensemble des cases + valeur de taille d'un côté
    	new -> n = n;
    	free(new);  // j'ai essayé sans mais le problème persiste
    	return new;
    }
     
    /*!
     *      Fonction désallouant dynamiquement le plateau passé en paramètre
     *
     *      \param p : plateau à désallouer
     */
    void detruirePlateau(plateau* p)
    {
    	assert(p!=NULL);
    	free(p);
    }
     
    int main()
    {
    	int i, n = 5;
    	plateau* p;
     
    	p = creerPlateau(n);
    	for(i = 0; i < n*n; i++)
    	{	
    		printf("*** check 1 ***\n");
    		printf("|%d", *(p -> tableau+i));
    		printf("*** check 2 ***\n");
    		if (i != 0 || i%n == 0)
    			printf("|\n");
    	}
    	detruirePlateau(p);
    	return 0;
    }

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    C'est normal, tu confonds les choux (la structure plateau) et les carootes (int) dans ton allocation, ça ne peut que mal finir

    Avec la structure suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct plateau
    {
    	int* tableau;
    	int n;
    };
    tu as deux allocations à faire si tu veux en créer une dynamiquement:
    - une allocation de la taille de la struct (un pointeur + un int, mais le plus simple est de demander au compilateur: sizeof(struct plateau) )
    - une allocation de n entiers pour le plateau

    donc:

    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
    /* évite de scroller si tu ne veux pas voir la solution */
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    struct plateau* nouveau_plateau(int n) {
      struct plateau* p = (struct plateau*) malloc(sizeof(struct plateau));
      p->tableau = (int*) malloc(sizeof(int)*n); // ou n*n si n représente la taille d'un côté
      p->n = n;
      return p;
    }

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Ah je comprends mon erreur, comme je ne voyais que des int dans ma structure, j'ai fait un malencontreux raccourci d'affectation. Il faut donc différencier structure et intérieur de la structure.

    Si tu passes encore par là, faut-il systématiquement caster les malloc ((plateau*) et (int*)) ? Peut-être à cause des pointeurs ? Je n'avais jamais fait ça jusqu'à présent.

    En tous cas, merci beaucoup pour ton intervention. Ça m'aide beaucoup !

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Si tu passes encore par là, faut-il systématiquement caster les malloc ((plateau*) et (int*)) ? Peut-être à cause des pointeurs ? Je n'avais jamais fait ça jusqu'à présent.
    J'utilise habituellement un compilateur C++, qui exige le cast. En C c'est inutile et même au contraire déconseillé, pour 1) des raisons très techniques de bug dissimulé au cas d'oubli d'un en-tête et 2) parce que tu dois changer ton code à trois endroits si tu changes le type de ton pointeur: dans la déclaration du type, dans le cast, et dans sizeof.

    Ce qui est conseillé en C est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int* ptr = malloc( sizeof *ptr ) // sizeof n'exige pas de parenthèse. Par convention on écrit sizeof(type) mais sizeof variable (sans parenthèses)
    PS: quand une réponse t'est utile il est courtois de la plussoyer

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  2. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  3. Réponses: 6
    Dernier message: 31/08/2005, 13h25
  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