Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur de segmentation (core dumped)

Sujet résolu
    14 octobre 2019 à 18:13:46

    Bonjour,

    Je ne comprend vraiment pas pourquoi mon code génère une erreur de segmentation, quelqu'un peut m'aider à comprendre pourquoi ?

    J'ai utiliser gdb pour savoir où est mon erreur et il me dit que c'est à la ligne :

    str[l] = aux;
    Voici mon code :
    #include <assert.h>
    #include <stdbool.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    size_t str_length(char *str) {
    	if(str == NULL){
    		return 0;
    	}
        size_t i = 0;
        while(str[i] != '\0'){
                i++;
        }
        return i;
    }
    
    
    void str_remove_char_with_index(char *str,size_t l){
        size_t i = str_length(str);
        char aux ;
        printf("i = %ld\n",i);
        while(l !=i-1){
            printf("l = %ld\n",l);
            aux = str[l+1]; 
            printf("str[l] = %c\n",str[l]);
            printf("aux = %c\n",aux);
            str[l] = aux;
            l++;
        }
    }
    
    
    int main(){
        char *a = (char *)calloc(20,sizeof(char));
        a = "abc";
        str_remove_char_with_index(a,1);
        printf("a = %s\n",a);
        return 0;
    }



    -
    Edité par RomainGENDREAU1 14 octobre 2019 à 18:27:34

    • Partager sur Facebook
    • Partager sur Twitter
      14 octobre 2019 à 18:20:20

      Bonjour,

      Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
      Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

      Pour plus d'informations, nous vous invitons à lire les règles générales du forum

      Merci de colorer votre code à l'aide du bouton Code

      Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: cpp;">Votre code ici</pre>.

      Liens conseillés

      • Partager sur Facebook
      • Partager sur Twitter
        14 octobre 2019 à 18:30:36

        Helo,

        Dans le main(), tu alloues de la place pour a -- qui contient alors une adresse donnée par calloc() -- , adresse que tu t'empresses d'oublier à la ligne suivante, en écrivant a="abc". Le problème, c'est que la chaine abc est stockée dans une zone mémoire read-only, et que tenter de la modifier provoque un segfault.

        Tu aurais écrit strcpy(a,"abc"), tu n'aurais pas eu de souci (mais je n'ai pas regardé tes fonctions) 

        • 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

          14 octobre 2019 à 18:39:28

          Ok merci beaucoup je ne savais pas que déclarer un char* avec "chaine de caracteres" stockait la mémoire en read-only.
          • Partager sur Facebook
          • Partager sur Twitter
            14 octobre 2019 à 20:07:46

            D'ailleurs c'est curieux que tu utilises une allocation dynamique pour allouer une chaîne de 20 caractères. Si tu déclares la chaîne ainsi :

            char a[20] = "abc" ;
            

            il me semble qu'il n'y a plus de souci : la chaîne littérale "abc" est recopiée dans le tableau, et le tableau appartient au programme qui peut donc le modifier.

            (Mais il ne faut surtout pas déclarer

            char *a = "abc" ;

            qui générerait le même problème, illustrant au passage qu'un tableau et un pointeur sont différents.)

            -
            Edité par robun 14 octobre 2019 à 20:08:14

            • Partager sur Facebook
            • Partager sur Twitter
              15 octobre 2019 à 9:56:56

              À vrai dire je n'ai jamais compris pourquoi les compilateurs C n'émettent pas d'erreur lorsqu'on essaye d'écrire dans une chaine de caractères constante non tableau.

              En C++, on a l'avantage d'avoir un warning lorsqu'on assigne une litéralle à char*.

              $ cat test.c
              int main()
              {
                      char *test = "foo";
                      test[0] = 'a';
              }
              $ clang -Weverything -pedantic -std=c11 test.c
              

              En C++ (mais on n'utilise pas les const char* de toute façon).

              $ cat test.cpp
              int main()
              {
                      char *test = "foo";
                      test[0] = 'a';
              }
              $ clang++ -Weverything -std=c++17 test.cpp
              test.cpp:3:15: warning: ISO C++11 does not allow conversion from string literal to 'char *' [-Wwritable-strings]
                      char *test = "foo";
                                   ^
              1 warning generated.
              

              Donc malheureusement on aura ce piège gratuit pour un nombre encore incertain d'années.

              -
              Edité par markand 15 octobre 2019 à 9:57:18

              • Partager sur Facebook
              • Partager sur Twitter

              git is great because Linus did it, mercurial is better because he didn't.

              Erreur de segmentation (core dumped)

              × 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