Partage
  • Partager sur Facebook
  • Partager sur Twitter

Segmentation fault (core dumped) erreur

    7 septembre 2020 à 16:19:15

    Bonjour,

    Quand j'execute ce code, j'ai un message d'erreur Segmentation fault (core dumped).

    Je ne comprends pas pourquoi.

    Pouvez vous m'aider ?

    Merci beaucoup !!!!

    #include <stdlib.h>
    
    int main ()
    
    {
        int *a;
        int array[3];
        char *b;
    
        *a = 3;        
        array[3] = 4;
        b = malloc(2);
        *(b+2)='5'; 
    
        return(0);
    }



    • Partager sur Facebook
    • Partager sur Twitter
      7 septembre 2020 à 17:17:10

      Salut,

      Tu déclares un pointeur a sans l'initialisé, il pointe donc n'importe ou en mémoire (probablement sur une zone mémoire non allouée a ton programme) et ensuite tu le déréférence en faisant *a pour écrire a l'emplacement ou pointe a en faisant *a = 3.

      Tu essayes donc d'écrire dans une zone mémoire non allouée a ton programme et ton OS t'envoie gentillement dans les roses en te disant que tu ne peux pas.

      Si tu veux vraiment passer par un pointeur, il faut passer par malloc.

      Seconde erreur, tu déclares un tableau de 3 cases, les index vont donc de 0 a 2 (inclus), et toi, tu essayes d'écrire a la 4eme case de ton tableau en faisant array[3] = 4; Tu es donc en dehors de ton tableau, et donc très certainement crash.

      Ceci dit, avec b tu fais n'importe quoi aussi.
      Tu déclares un pointeur b (non initialisé), puis plus tard tu fais un malloc dessus, ce qui est une bonne chose.
      Cependant, pourquoi un malloc de 2 ?
      Et surtout, en dessous, pourquoi faire *(b +2) ?
      En faisant ça tu prends l'adresse sur laquelle pointe b et tu décales de 2 octets, et vu que tu as fais un malloc de 2 octets, si tu écris a cet endroit, tu es hors de la zone mémoire qui t'es allouée et c'est exactement l'erreur que tu fais puisque tu essayes d'écrire a cet emplacement précis en faisant *(b+2) = quelquechose.

      -
      Edité par ironwolf151 7 septembre 2020 à 17:56:43

      • Partager sur Facebook
      • Partager sur Twitter
        7 septembre 2020 à 17:27:25

        Tu essayes d'accéder à des adresses de manière complètement aléatoire. Je t'invite à (re)lire la partie sur les pointeurs et les tableaux 

        https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c/15417-a-lassaut-des-pointeurs

        • Partager sur Facebook
        • Partager sur Twitter
          7 septembre 2020 à 19:23:16

          ironwolf151 a écrit:

          Si tu veux vraiment passer par un pointeur, il faut passer par malloc.

          Pas spécialement:

          int t[]={1,2};
          int *pt=t;
          	
          printf("%d %d\n",pt[0],*(pt+1));
          
          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            8 septembre 2020 à 10:06:26

            Bonjour,

            Merci à tous pour vos réponses.

            En effet, je vais passer voir le cours à-lassaut-des-pointeurs. Ca va m'être utile.

            Merci ironwolf151, c'est bien plus clair maintenant. Et mon code compile bien. j'ai changé la taille du tableau, augmenté le malloc pour b à 3 octets

            Et fait un malloc de a pour la taille d'un int

            int main ()
            
            {
            
                int *a;
            
                int array[4];
                char *b;
            
             
                a = malloc(sizeof(int));        
                *a=2;
                
                array[3] = 4;
            
                b = malloc(3);
                *(b+2)='5'; 
                
                return(0);
            
            }
            



            • Partager sur Facebook
            • Partager sur Twitter
              8 septembre 2020 à 10:41:14

              Je vais poser une question bête peut être, mais, quelle est l'utilité de ce bout de code en fait ? parceque ce qu'il fait n'a pas vraiment de sens a première vue.
              • Partager sur Facebook
              • Partager sur Twitter
                8 septembre 2020 à 11:09:30

                Salut,

                Bon, déjà on n'alloue pas un entier quand il suffit de le déclarer car une allocation coûte du temps et de la mémoire... Et non, allouer un int ne prend pas 4 (ou 8) octets en mémoire.

                Ensuite parce que l'allocation est surtout utilisée pour combler l'incapacité du programmeur à deviner le volume de mémoire nécessaire lors de l'exécution. Si on peut ne-serait-ce que l'estimer, on déclare grand.

                Personnellement, si je peux être certain d'avoir besoin d'au max 2ko, je déclare un char tab[2000].

                Une allocation, ça se libère, les libérations sont une habitude à prendre immédiatement, même pour "juste un entier".

                Force toi à trouver une utilité à ton code. Je me doute que si ton code n'a pas de sens, c'est que tu veux essayer des trucs ou comprendre comment ça se passe, mais dans ce cas, il faut faire de l'affichage, tes calculs se font ou pas mais tu n'as pas moyen de savoir si ça fait ce que tu attends que ça fasse.

                Bonne continuation.

                • Partager sur Facebook
                • Partager sur Twitter

                Bonhomme !! | Jeu de plateforme : Prototype.

                  8 septembre 2020 à 22:28:23

                  Hello, je reprends mes vieux cours incomplets de C de la université et je n'arrivais pas à voir ce qui clochait sur cet exercice là. (Et bien sur je n'avais pas de correction ou d'explication avec moi).

                  En tout cas, merci, j'ai laissé mes feuilles jaunies de mes classeurs pour suivre les cours de C d'openclassroom qui sont bcp clair à mon gout !

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Segmentation fault (core dumped) erreur

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown