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 averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut Erreur de segmentation
    Bonjour, je veux afficher des résultats d un cos et sin en float, mais ca me fait une erreur de segmentation sous gcc et je ne comprends pas pourquoi

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    /// Some <math.h> files do not define M_PI...
    #ifndef M_PI
    #define M_PI 3.14159265358979323846
    #endif
     
    int main()
    {
      float **ps;
      int i, nvertices = 8;
     
      ps = (float**) malloc(nvertices);
     
      for (i = 0; i < nvertices; i++)
        ps[i] = (float*) malloc(3);
     
      for (i = 0; i < nvertices; i++)
      {
        ps[i][0] = cos(i * (2 * M_PI) / nvertices);
        ps[i][1] = sin(i * (2 * M_PI) / nvertices);
        ps[i][2] = 0.0;
      }
     
      for (i = 0; i < nvertices; i++)
          printf("(%f, %f, %f)\n", ps[i][0], ps[i][1], ps[i][2]);
     
      for (i = 0; i < nvertices; i++)
        free(ps[i]);
     
      free(ps);
    }

  2. #2
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    bien le bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ps = (float**) malloc(nvertices);
    tu geres ps comme etant un tableau de float* a 8 cases. hors un float* ne pese pas un octet. Tu n'alloues donc pas assez de memoire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ps = (float**) malloc(nvertices*sizeof(float*));
    idem
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        ps[i] = (float*) malloc(3);
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        ps[i] = (float*) malloc(3*sizeof(float));
    tu ne testes pas le retour des malloc.
    le main renvoie int, il te manque donc le return qui va bien.

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Erreur de segmentation
    Citation Envoyé par Trunks
    Bonjour, je veux afficher des résultats d un cos et sin en float, mais ca me fait une erreur de segmentation sous gcc et je ne comprends pas pourquoi
    Comportement indéfini (débordement de tableau).

    Pas mal d'erreurs d'allocations et des mauvaises pratiques :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    /// Some <math.h> files do not define M_PI...
    #ifndef M_PI
    #define M_PI 3.14159265358979323846
    #endif
     
    int main ()
    {
       /* -ed-
          float **ps;
     
          mieux vaut definir et initialiser en meme temps quand c'est possible
        */
     
       /* -ed-
          int i, nvertices = 8;
     
          le bon type pour les indices et les tailles est size_t.
        */
     
       size_t i;
       size_t nvertices = 8;
     
       /* -ed-
          ps = (float**) malloc(nvertices);
     
          Suppression du cast inutile.
          La taille a allouer est n * sizeof *p. Toujours.
          malloc() peut echouer...
     
        */
       float **ps = malloc (nvertices * sizeof *ps);
     
       if (ps != NULL)
       {
          /* -ed- ajoute detection d'erreur d'allocation. */
          int err = 0;
     
          for (i = 0; i < nvertices; i++)
          {
             /* -ed-
                ps[i] = (float *) malloc (3);
     
                Suppression du cast inutile.
                La taille a allouer est n * sizeof *p. Toujours.
                malloc() peut echouer...
     
              */
             ps[i] = malloc (3 * sizeof *ps[i]);
     
             err = ps[i] == NULL;
          }
     
          if (!err)
          {
             for (i = 0; i < nvertices; i++)
             {
                ps[i][0] = cos (i * (2 * M_PI) / nvertices);
                ps[i][1] = sin (i * (2 * M_PI) / nvertices);
                ps[i][2] = 0.0;
             }
     
             for (i = 0; i < nvertices; i++)
             {
                /* -ed- ameliore le format */
    #define FMT "%9.6f"
                printf ("(" FMT ", " FMT ", " FMT ")\n"
                        ,ps[i][0]
                        ,ps[i][1]
                        ,ps[i][2]);
    #undef FMT
             }
          }
     
          for (i = 0; i < nvertices; i++)
          {
             /* -ed- ajoute forcage a NULL */
             free (ps[i]), ps[i] = NULL;
          }
     
          free (ps);
       }
     
    /* -ed- Jusqu'a C90/NA1 (aka C95), le return de main doit etre explicite. */
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Désolé de répondre si tard. J'ai fais du C++ jamais de C, et je ne connaissais pas bien le malloc. J'avais réussi a trouver la réponse sur un tchat un peu plus tard et j'ai oublié de revenir sur ce forum pour le signaler
    Merci de votre aide.

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

Discussions similaires

  1. Gcc scanf et erreur de segmentation
    Par titor dans le forum C
    Réponses: 1
    Dernier message: 27/10/2005, 19h27
  2. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  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