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 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>.
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)
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
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.)
À 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*.
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
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.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
git is great because Linus did it, mercurial is better because he didn't.