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 (Inconnue)


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 1
    Points : 2
    Points
    2
    Par défaut Erreur de segmentation (Inconnue)
    Bonjour,

    Je voudrais savoir d'ou peut venir mon erreur de segmentation dans le code 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
    #include <stdio.h>
     
    const int OUT_MAX_SIZE = 1000000;
     
     
    int main ()
    {
    	short line_in[OUT_MAX_SIZE];
    	short line_out[OUT_MAX_SIZE];
    	short cur_line;
    	int cur_car;
    	int nb_of_car = 0;
    	int out_cur_car;
     
    	line_in[0] = 1;
     
    	for (cur_line = 0; 1; cur_line++)
    	{
    		printf ("[%i]", cur_line);
     
    		for (cur_car = 0; cur_car <= sizeof (line_in); cur_car++)
    		{
    			if (line_in[cur_car] = 0)
    			{
    				break;
    			}
     
    			if (line_in[cur_car] = line_in[cur_car-1])
    			{
    				nb_of_car++;
    			}
    			else
    			{
    				line_out[out_cur_car] = nb_of_car;
    				printf ("%i", nb_of_car);
    				out_cur_car++;
    				line_out[out_cur_car] = line_in[cur_car];
    				printf ("%i", line_in[cur_car]);
    				out_cur_car++;
    			}
    		}
     
    		printf ("\n");
     
    	}
     
    	return (0);
    }
    J'ai déjà cherché pdt pas mal de temps, mais impossible de trouver une reponse.

    Merci d'avance,

    Dark-Meteor

  2. #2
    Membre confirmé
    Homme Profil pro
    Fondateur
    Inscrit en
    Octobre 2002
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Fondateur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2002
    Messages : 445
    Points : 503
    Points
    503
    Par défaut
    Déjà, quel est l'intérêt de cette boucle infinie ?

    Ensuite en compilant avec l'option -g de gcc et en utilisant gdb, tu aurais obtenu ça :

    Program received signal SIGSEGV, Segmentation fault.
    0x0804843d in main () at test.c:34
    34 line_out[out_cur_car] = nb_of_car;

    A première vue, tu dois dépasser le nombre d'éléments du tableau et tu tentes d'accéder à une case qui n'existe pas de ton tableau.

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    out_cur_car n'a pas l'air d'être initialisé.

  4. #4
    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 (Inconnue)
    Citation Envoyé par Dark-Meteor

    Je voudrais savoir d'ou peut venir mon erreur de segmentation dans le code suivant : <...>
    Déjà, y'a ça...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    main.c: In function `main_':
    main.c:24: warning: comparison between signed and unsigned
    main.c:26: warning: suggest parentheses around assignment used as truth value
    main.c:31: warning: suggest parentheses around assignment used as truth value
     
    main.c:16: warning: 'out_cur_car' might be used uninitialized in this function
    Déjà, on a plus de warnings, mais la défintion et la taille du tableau sont suspectes :
    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
    #include <stdio.h>
     
    #if 0
    /* -ed- remplace les variables par des constantes. */
    #define OUT_MAX_SIZE 1000000
    #else
    /* -ed- reduction de la taille : OK. */
    #define OUT_MAX_SIZE 100000
    #endif
     
     
    int main ()
    {
       short line_in[OUT_MAX_SIZE];
       short line_out[OUT_MAX_SIZE];
       short cur_line;
     
       /* -ed mis size_t au lieu de short */
       size_t cur_car;
     
       int nb_of_car = 0;
     
       /* -ed- ajoute = 0 */
       int out_cur_car = 0;
     
       line_in[0] = 1;
     
       for (cur_line = 0; 1; cur_line++)
       {
          printf ("[%i]", cur_line);
     
          for (cur_car = 0; cur_car <= sizeof (line_in); cur_car++)
          {
             /* -ed- mis == au lieu de = */
             if (line_in[cur_car] == 0)
             {
                break;
             }
     
             /* -ed- mis == au lieu de = */
             if (line_in[cur_car] == line_in[cur_car-1])
             {
                nb_of_car++;
             }
             else
             {
                line_out[out_cur_car] = nb_of_car;
                printf ("%i", nb_of_car);
                out_cur_car++;
                line_out[out_cur_car] = line_in[cur_car];
                printf ("%i", line_in[cur_car]);
                out_cur_car++;
             }
          }
     
          printf ("\n");
     
       }
     
       return (0);
    }
    On a plus le segfault. Celui-ci est du à la définition d'un tableau trop grand en mémoire automatique. Il faut utiliser la mémoire statique ou la mémoire allouée. (Je n'ai pas vérifié le reste du code).

  5. #5
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    On a plus le segfault. Celui-ci est du à la définition d'un tableau trop grand en mémoire automatique. Il faut utiliser la mémoire statique ou la mémoire allouée.
    En effet. C'est dangereux d'utiliser des tableaux si grands en mémoire automatique (utiliser des vecteurs extensibles)

  6. #6
    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
    Citation Envoyé par Patriarch24
    C'est dangereux d'utiliser des tableaux si grands en mémoire automatique (utiliser des vecteurs extensibles)
    Hum, en C on parle de 'tableaux redimensionnables'...

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

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. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  4. 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